Java学习第六节数组

举报
吴梦青 发表于 2021/11/22 08:01:07 2021/11/22
【摘要】 问题:把用户输入的数字中比平均数大的数字输出创建数组int[] number=new int[100];package input;import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner in= new Scanner(System.in); int user...

问题:把用户输入的数字中比平均数大的数字输出
创建数组

int[] number=new int[100];
package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		int users_input=in.nextInt();
		int[] number=new int[100];//这个程序是危险的,如果输入的数据大于100个,程序就会报错
		int sum=0;
		int cnt=0;
		while(users_input!=-1) {
			sum+=users_input;
			number[cnt++]=users_input;
			users_input=in.nextInt();
		}
		if(cnt>0) {
			for(int i=0;i<cnt;i++) {
				if(number[i]>(sum/cnt*1.0))
					System.out.println(number[i]);
			}
		}
	}
}

数组:数组是一个容器

  1. 所以元素都有同样的类型
  2. 一旦创建,不能改变大小
    定义数组变量
  • <类型>[] <名字>= new <类型>[元素个数]
    new创建的数组会得到默认的0值
  • 元素个数必须是整数
  • 元素个数必须给出
  • 元素个数可以是变量
    数组的元素通过索引或下标访问。
    编译器不会检查是否用了有效的下标。
    如果运行的时候出现了无效的下标,可能会导致程序终止。
package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		int users_input=in.nextInt();
		int[] number=new int[cnt];//这里是不行的,是错误的,运行不了
		int cnt=0;
		cnt=in.nextInt();//用户有多少个数字要读进来
		int sum=0;
		if(cnt>0) {
			for(int i=0;i<cnt;i++)
			{
				number[i]=in.nextInt();
				sum+=number[i];//输入的数据都加进来
			}
			for(int i=0;i<cnt;i++) {
				if(number[i]>(sum/cnt*1.0))
					System.out.println(number[i]);
			}
		}	
	}
}

length:每个数组都有一个内部成员length,length是数组元素的数量

for(i=0;i<number.length;i++)
			sum+=number[i];

使用这个number.length的好处是使得代码具有可扩展性。代码不需要修改就可适应于今后的使用。

数组变量

int [] scores={1,2,3,4,5};
这时候不用给出数组的大小,编译器会给我们数出来的。
普通变量:
int i=5;
i 里面放的就是5;i是5这个数字的所有者
数组:
int [] a=new int [10];
a是10个数组的管理者,a里面没有数据。
new:在某个地方制造出一个东西。
在这里插入图片描述

int[] a=new int[10];
		a[0]=5;
		int[]b=a;
		b[0]=16;
		System.out.print(a[0]);

b也是管理者, b=a 这个赋值是让a和b这两个管理者同时管理这些数据。b[0]=16是把这个数组的第一个元素变成了16,这个数组的第一个元素即是a[0]又是b[0]。
在这里插入图片描述

package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		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 input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		int [] a= {1,2,3,4,5};
		int[] b=new int[a.length];
		for(int i=0;i<a.length;i++)
			b[i]=a[i];
	}
}

数组下标的使用
投票统计:输入不确定范围的【0,9】内的整数,统计每一种数字出现的次数,输入-1表示结束。

package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		int x;
		int [] number= new int[10];//表示数字出现了多少次
		x=in.nextInt();
		while(x!=-1) {
			if(x>=0&&x<=9) {
				number[x]++;
			}
			x=in.nextInt();
		}
		for(int i=0;i<number.length;i++)
			System.out.println(i+":"+number[i]);
		//下标是用来标记的,下标对应的那个内存里存的是这个数字的个数
	}
}

遍历数组

//线性搜索
package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		
		
		int [] data= {3,2,5,7,4,9,11,3,4,12,28};	
		int x=in.nextInt();
		int loc=-1;
		for(int i=0;i<data.length;i++) {
			if(x==data[i])
				loc=i;
		}
		if(loc!=-1)
			System.out.print(x+"在第"+(loc+1)+"个");
			//这个+不是计算的,是做字符串的连接的。所以loc+1要加括号,否则它就会把loc当成一个字符串,然后做字符串的连接,就不是数字的加了
		else
			System.out.print(x+"不在里面");
	}
}

常见错误

  • 循环结束条件是<=数组长度
  • 离开循环后,继续用i的值来做数组元素的下标
    FOR-EACH循环
for(int k:data)
//k依次等于data中的元素,从第一个到最后一个
//很适合遍历,可以给数组赋值
//但是就是每次不知道是数组中的那个元素
//这个循环是c语言中没有的
//是值的关系,不是具体的存储位置的对应关系

判断素数

for(int i=3;i<Math.sqrt(x);i+=2) {
			if(x%i==0) {
				isPrime=false;
				break;
			}
		}

构造素数表

  • 构造n以内(不含)的素数表
  • 创建prime为Boolean[n],初始化其所有元素为true,prime[x]为true表示x是素数
  • 令x=2
  • 如果x是素数,则对于(i=2;xi<n;i++),令prime[ ix ]=false
  • 令x++,如果x<n,重复3,否则结束
package input;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		
		boolean[] isPrime=new boolean[100];
		for(int i=2;i<isPrime.length;i++) {
			isPrime[i]=true;//new的数据默认是0,我们把它们初始化为true
		}
		for(int i=2;i<isPrime.length;i++) {
			if(isPrime[i]) {
				for(int k=2;i*k<isPrime.length;k++) {
					isPrime[i*k]=false;//凡是倍数的都扔了		
				}
			}
		}
		for(int i=0;i<isPrime.length;i++) {
			if(isPrime[i]) {//剩下的都是true
				System.out.print(i+" ");
			}
		}
		System.out.println();
	}
}

二维数组

int[][] a=new int[3][5];//创建一个二维数组

编译器会自己数有几个元素

二维数组的初始化
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。