Java中的数组

数组

一维数组

数组是同一类型的多条数据的容器。

数组是容器,是存取数据的载体,不是数据本身。

数组用于存储多条数据,单条数据没必要使用数组。

数组的数据只能是同一种类型,不能是多种类型。

数组的四个重要概念:

1、数组              是数据的容器,存取数据找数组;但数组不是数据本身,不要拿数组进行运算。
2、数组元素/元素     数组元素才是数据,一个数组会有多个数组元素。
3、数组下标          就是数组元素在数组中的编号,从0开始,记录了元素在数组中的位置。
4、数组长度          就是数组中元素的个数。

数组下标从0开始,到长度减1.

定义数组的方式:

元素类型[]   数组变量名 =; 
int[] arr =;
String[] arr =;
int[] arr ;
  arr 是 数组;
  arr[0]  arr[1]  ...  是 数组元素;
  其中,0,1 ...是 数组下标;
 arr.length        是 数组长度;

定义一个数组变量,不只有一个数组变量可以用; 数组元素,数组长度都可以使用。

数组的赋值有两种方式:

 静态初始化  --  就是数组和元素同时赋值
int[] arr = {1,2,3,4,5};
String[] name = {"liubei","guanyu","zhangfei"};
动态初始化  -- 先赋值数组,后赋值元素,分别赋值

int[] arr = new int[10];  //必须在右边指定长度,否则系统不知道该分配多少内存空间

数组的操作就是对下标的操作。

数组的增加元素和删除元素

增加元素时,如果不是在最后追加;那么需要把后面的所有元素后移一个位置。
删除元素时,如果不是在最后删除,那么需要把后面的所有元素前移一个位置。

增删元素时,数组的效率并不好;而链表增删元素时效率比较好。
而查询元素时,数组效率比较高,而链表的效率很低。

一维数组内存解析

一维数组内存解析

练习

1.简易版的学生成绩管理系统

功能: 先输入班级人数,作为数组的长度。然后用循环输入每个同学的姓名和考试成绩,然后求最高分,总分和平均分。最高分要打印所有最高分学生的名字。

public class Student {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("输入班级的人数");
		int num=sc.nextInt();
		
		if(num<1){
			System.out.println("人数输入错误,程序结束");
			return;
		}
		
		double[] arr=new double[num];
		String[] name=new String[num];
		double sum=0.0;
		double max=arr[0];
		
		for(int i=0;i<num;i++){
			System.out.println("请输入第"+(i+1)+"名同学的姓名和考试成绩");
			name[i]=sc.next();
			arr[i]=sc.nextDouble();
			
			if(arr[i]<0 || arr[i]>100){
				System.out.println("输入成绩错误,请重新输入");
				i--;
			}
		}
		
		for(int i=0;i<arr.length;i++){
			sum +=arr[i];
			if(max<arr[i]){
				max=arr[i];
				
			}
		}
		
		for(int i=0;i<arr.length;i++){
			if(arr[i]==max)
				System.out.println(name[i]+"得最高分为:"+max);
		}
		
		double aver;
		aver=sum/num;
		System.out.println("学生总成绩为:"+sum);
		System.out.println("学生平均分为:"+aver);	
		
		sc.close();
	}
}
2.公司年底抽奖程序。

定义一个长度是20的字符串数据,把公司的人名都输入进去。然后抽取3等奖3名,2等奖2名,1等奖1名。

注意:中奖人不会出现重复。

使用随机数。

public class Prize {
	public static void main(String[] args) {
		Random ran = new Random();
		String[] name={"刘备","关羽","张飞","赵云", "黄忠","马超","诸葛亮","庞统","关平","关兴","张苞","刘禅","黄权", "姜维","魏延","马岱","法正","李严","廖化","孙尚香"};
		int[] flag=new int[name.length];
		
		String[] emps=new String[6];
		
		for(int i=0;i<emps.length;i++){
			int index=ran.nextInt(name.length);
			emps[i]=name[index];
			if(flag[index]==1){
				i--;
			}else{
				flag[index]=1;
			}
		}
		
		for(int i=0;i<emps.length;i++){
			if(i<3)
				System.out.println("三等奖:"+emps[i]);
			else if(i<5)
				System.out.println("二等奖:"+emps[i]);
			else
				System.out.println("一等奖:"+emps[i]);
		}
	}
}
3.输入一个数字,统计其中每个数出现的次数。比如: 输入 33791 , 输出结果:

​ 1出现了1次 3出现了2次 7出现了1次 9出现了1次

public class Appear {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入一个正数");
		int num=sc.nextInt();
		
		if(num<0){
			System.out.println("输入不合法,退出程序");
		}
		
		int n=0;
		int[] flag=new int[10];
		int[] times=new int[10];
		for(;;){
			n=num%10;
			num=num/10;
			if(flag[n]==1){
				times[n]++;
			}else{
				flag[n]=1;
				times[n]=1;
			}
			if(num==0){
				break;
			}
		}
		
		for(int i=0;i<10;i++){
			if(times[i] !=0){
				System.out.println(i+"出现了"+times[i]+"次");
			}
		}
	}
}
4.身份证 第 18位 校验位的 算法:

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少?

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是10,身份证的最后一位号码就是罗马数字X。

public class IdCard {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入身份证前十七位:");
		String num=sc.next();
		if(num.length() != 17){
			System.out.println("非法输入,程序结束");
			return;
		}
		int[] xi={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
		String[] res={"1","0","x","9","8","7","6","5","4","3","2"};
		int sum=0;
		for(int i=0;i<xi.length;i++){
			char ch=num.charAt(i);
			int x=ch-'0';
			sum=sum+x*xi[i];
		}
		System.out.println(res[sum%11]);
		sc.close();
	}
}

二维数组:数组中的数组

格式1(动态初始化):int[] [] arr=new int[3] [2];

定义了名称为arr的二维数组

二维数组中有3个一维数组

每一个一维数组中有2个元素

一维数组的名称分别为arr[0], arr[1], arr[2]

给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;

格式2(动态初始化):int[] [] arr = new int[3] [];

二维数组中有3个一维数组。

每个一维数组都是默认初始化值null (注意:区别于格式1)

可以对这个三个一维数组分别进行初始化

arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

注:

int[] []arr = new int[] [3]; //非法

格式3(静态初始化):int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};

定义一个名称为arr的二维数组,二维数组中有三个一维数组

每一个一维数组中具体元素也都已初始化

第一个一维数组 arr[0] = {3,8,2};

第二个一维数组 arr[1] = {2,7};

第三个一维数组 arr[2] = {9,0,1,6};

第三个一维数组的长度表示方式:arr[2].length;

注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。

Java中多维数组不必都是规则矩阵形式

二维数组内存解析

二维数组内存解析

练习

使用二维数组打印10行杨辉三角

杨辉三角

public class YangHuiTest {
    public static void main(String[] args) {
        //声明并初始化二维数组
        int[][] yanghui=new int[10][];
        //给数组元素赋值
        for(int i=0;i<yanghui.length;i++){
            yanghui[i]=new int[i+1];
            //给首元素赋值
            yanghui[i][0]=1;
            //给末元素赋值
            yanghui[i][i]=1;
            //给每行非首末元素赋值
            for(int j=1;j<yanghui[i].length-1;j++){
                yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
            }
        }
        //遍历二维数组
        for(int i=0;i<yanghui.length;i++){
            for(int j=0;j<yanghui[i].length;j++){
                System.out.print(yanghui[i][j]+" ");
            }
            System.out.println();
        }
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值