数组
一维数组
数组是同一类型的多条数据的容器。
数组是容器,是存取数据的载体,不是数据本身。
数组用于存储多条数据,单条数据没必要使用数组。
数组的数据只能是同一种类型,不能是多种类型。
数组的四个重要概念:
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();
}
}
}