数组
定义:int[] numbers = new int[100];
一旦创建不能改变大小,其中所有的元素具有相同的数据类型;
元素个数必须给出,元素个数必须是整数,元素个数可以是变量;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int num, sum = 0, count = 0, i = 0;
int[] number = new int[100];
while(true)
{
num = in.nextInt();
if(num == -1) break;
number[i] = num;
sum += num;
count ++;
i ++;
}
double ave = sum * 1.0 / count;
System.out.println(ave);
for(int j = 0; j < count; j ++)
{
if(number[j] >= ave)
{
System.out.print(number[j] + " ");
}
}
}
}
数组的大小可以是变量
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int num, sum = 0;
int count = in.nextInt();
int[] number = new int[count];
for(int i = 0; i < count; i ++)
{
num = in.nextInt();
number[i] = num;
sum += num;
}
double ave = sum * 1.0 / count;
System.out.println(ave);
for(int j = 0; j < count; j ++)
{
if(number[j] >= ave)
{
System.out.print(number[j] + " ");
}
}
}
}
数组的大小
int[] number = new int[100];
number.length
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int num, sum = 0;
int count = in.nextInt();
int[] number = new int[count];
for(int i = 0; i < number.length; i ++)
{
num = in.nextInt();
number[i] = num;
sum += num;
}
double ave = sum * 1.0 / count;
System.out.println(ave);
for(int j = 0; j < number.length; j ++)
{
if(number[j] >= ave)
{
System.out.print(number[j] + " ");
}
}
}
}
数组变量
直接初始化数组
int[] number = {1, 2, 3, 4};
number.length = 4;
number[0] = 1;
number[1] = 2;
注意
package hello;
public class Main{
public static void main(String[] args){
int[] a = {
1, 2, 3, 4, 5};
int[] b = a;
System.out.println(a[2]);
b[2] = 0;
System.out.println(a[2] + " " + b[2]);
}
}
实际是让 a 和 b 都管理一个数组,是管理者;
package hello;
public class Main{
public static void main(String[] args){
int[] a1 = {
1, 2, 3, 4, 5};
int[] a2 = a1;
for(int i = 0; i < a2.length; i ++)
{
a2[i] ++;
}
for(int i = 0; i < a1.length; i ++)
{
System.out.print(a1[i] + " ");
}
}
}
- 数组变量是数组的管理者而非数组本身
- 数组必须创建出来交给数组变量来管理
- 数组变量之间的赋值是管理权限的赋予
- 数组变量之间的比较是判断是否管理同一个数组
package hello;
public class Main{
public static void main(String[] args){
int[] a1 = {
1, 2, 3, 4, 5};
int[] a2 = a1;
System.out.println(a1 == a2);
int[] a3 = {
1, 2, 3, 4, 5};
System.out.println(a1 == a3);
}
}
/*
true
false
*/
数组变量之间的比较是判断是否管理同一个数组
要是需要判断每个元素,则需要遍历(前提是两个数组相同的长度)
package hello;
public class Main{
public static void main(String[] args){
boolean flag = false;
int[] a = {
1, 2, 3, 4, 5};
int[] b = new int[a.length];
for(int i = 0; i < b.length; i ++)
{
b[i] = a[i];
}
for(int i = 0; i < b.length; i ++)
{
if(a[i] != b[i])
{
flag = true;
break;
}
}
if(!flag)
{
System.out.println("相等");
}
else
{
System.out.println("不相等");
}
}
}
/*
相等
*/
复制数组
必须遍历
package hello;
public class Main{
public static void main(String[] args){
int[] a = {
1, 2, 3, 4, 5};
int[] b = new int[a.length];
for(int i = 0; i < b.length; i ++)
{
b[i] = a[i];
}
for(int i = 0; i < b.length; i ++)
{
System.out.print(b[i] + " ");
}
System.out.println(a == b);
}
}
/*
1 2 3 4 5 false
*/
for-each 循环
缺点是不知道数组元素的具体位置;
for-each 循环不能去修改数组,只能读出数组的值;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
boolean flag = false;
int[] number = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n = in.nextInt();
for(int k : number)
{
if(k == n)
{
flag = true;
break;
}
}
if(flag)
{
System.out.println("存在");
}
}
}
下面的操作不能修改数组;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int[] number = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int k : number)
{
k = 0;
}
for(int k : number)
{
System.out.print(k + " ");
}
}
}
/*
1 2 3 4 5 6 7 8 9 10
*/
输出素数优化
忽略偶数
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
boolean flag =false;
int n = in.nextInt();
System.out.print(2 + " ");
for(int i = 3; i <= n; i += 2)
{
flag = false;
for(int j = 3; j < i; j += 2)
{
if(i % j == 0)
{
flag = true;
break;
}
}
if(!flag)
{
System.out.print(i + " ");
}
}
}
}
用 Math.sqrt(x) 缩短时间;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
boolean flag =false;
int n = in.nextInt();
System.out.print(2 + " ");
for(int i = 3; i <= n; i += 2)
{
flag = false;
for(int j = 3; j <= Math.sqrt(i); j += 2)
{
if(i % j == 0)
{
flag = true;
break;
}
}
if(!flag)
{
System.out.print(i + " ");
}
}
}
}
用已经存在的素数去判断后面的素数;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
boolean flag =false;
int cnt = 1;
int[] number = new int[50];
number[0] = 2;
int n = in.nextInt();
OUT:
for(int i = 3; i <= n; i += 2)
{
for(int j = 0; j < cnt; j ++)
{
if(i % number[j] == 0)
{
continue OUT;
}
}
number[cnt ++] = i;
}
for(int k : number)
{
if(k != 0)
{
System.out.print(k + " ");
}
}
}
}
忽略 2x 3x 4x ……这些,剩余的就是素数;
需要注意的是,新开的数组下标是从 0 开始的,新开的时候就规定就好了,比如新开 10 个,那么下标就是 0 ~9 ,当遍历赋值 1 ~ 10 的时候,实际上没有下标 10 的位置,所以数组越界,要是必须要用到下标 10,则可以多开一个空间,就是 0 ~ 11 ,就有下标 10 了;
这里和 C++ 不同,C++ 会根据提供的范围自动分配;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
boolean[] number = new boolean[n + 1];
for(int i = 2; i <= n; i ++)
{
number[i] = true;
}
for(int i = 2; i <= n / 2; i ++)
{
for(int j = 2; i * j <= n; j ++)
{
number[i * j] = false;
}
}
for(int i = 2; i <= n; i ++)
{
if(number[i] == true)
{
System.out.print(i + " ");
}
}
}
}
二维数组
int[][] a = new int[3][5];
读取二维数组的行和列;
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int[][] number = {
{
1, 2, 3, 4}, {
5, 6, 7}};
for(int i = 0; i < number.length; i ++)
{
for(int j = 0; j < number[i].length; j ++)
{
System.out.print(number[i][j] + " ");
}
System.out.println();
}
}
}