Day7:一维数组

1.理解数组

例:存储50个学生某门课程的成绩并求50人的平均分。
分析:可以定义50个变量,分别存放50个学生的成绩。

int score1=95;
int score2=90;
...
int score50=60;
double average=(score1+...+score50)/50;
System.out.print("平均成绩为:"+average);

该例的代码缺陷很明显,首先是定义的变量个数太多,如果存储10000个学生的成绩,难道真定义10000个变量吗?显然不可能。另外也不利于数据处理,如要求计算所有成绩之和或最高分,要输出所有成绩,就需要把所有的变量名都写出来,这显然不是一种好的实现方法。
java针对此类问题提供了有效的存储方式——数组。在Java中,数组是用来存储一组相同类型数据的数据结构。当数组初始化完毕后,Java为数组在内存中分配一段连续的空间,其在内存中开辟的空间也将随之固定,此时数组的长度就不能再发生改变。即使数组中没有保存任何数据,数组所占据的空间依然存在。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        //声明
        int[] a;
        String b[];
        double []c;
        // 分配空间,使用New关键字来分配空间,new关键字是java中优先级最高的
        a=new int[5];
        b=new String[6];
        c=new double[4];
        //赋值,并不一定把5个全部赋值
        a[0]=10;
        a[1]=14;
        a[2]=18;
        a[3]=24;
        a[4]=33;
        //声明的同时分配空间
        char[] ch=new  char[10];
        float f[]={11.1f,22.2f};//声明分配空间并赋值
        int []d=new  int[]{1,2,3};//基本不用
        /*int[] g;
        g={1,2,3};使用大括号不能分开,必须一次性做完*/

2.定义数组(声明的同时分配空间)

在Java中,定义数组的语法有如下两种。
数据类型 [] 数组名=new 数据类型[数组长度];
或者:
数据类型 数组名 [] =new 数据类型 [数组长度];

(1)定义数组时一定要指定数组名和数组类型。
(2)必须书写“[]”,表示定义了一个数组,而不是一个普通的变量。
(3)“[数组长度]”决定连续分配的空间的个数,通过数组的length属性可获取此长度。
(4)数组的数据类型用于确定分配的每个空间的大小。
例:使用两种语法分别定义整型数组scores与字符串数组cities,scores的长度是5,cities的长度是6 。

int [] scores=new [5];
String cites []= new String[6];

该例为数组scores分配了5个连续空间,每个空间存储整型的数据,即占用4字节空间,每个空间的值为0 。为数组cites分配了6个连续空间,用来存储字符串类型的数据,每个空间的值是null。

3.数组元素的表示与赋值

由于定义数组时内存分配的是连续的空间,所以数组元素在数组里顺序排列编号,该编号即元素下标,它标明了元素在数组中的位置。首元素的编号 规定为0,因此,数组的下标依次为0,1,2,3,4,…依次递增,每次增长数为1.数组中的每个元素都可以通过下标来访问。例如,数组scores的第一个元素表示为scores[0] 。
获得数组的语法格式如下。
例如,下面两行代码分别为scores数组的第一个元素和第二个元素赋值。

scores[0]=65;//表示为scores数组中的第一个元素赋值65
scores[1]=87;//表示为scores数组中的第二个元素赋值87

4.数组的初始化(声明的同时赋值)

所谓数组的初始化,就是在定义数组的同时一并完成赋值操作。
数组初始化的语法格式如下。
数据类型[]数组名={值1,值2,值3,…,值n};
或者:
数据类型[]数组名=new 数据类型[]{值1,值2,值3,…,值n};
下面两个语句都是定义数组并初始化数组。

int scores[]={75,67,90,100,0};//创建一个长度为5的数组scores
//或者
int scores[]=new int[]{75,67,90,100,0};
//法二
Scanner scores=new Scanner(System.in);
for(i=0;i<30;i++){
	scores[i]=scores.nextInt();
}

5.遍历数组

在编写程序时,数组和循环往往结合在一起使用,可以大大地简化代码,提高程序编写效率。通常用for循环遍历数组。
例:创建整型数组,从控制台接受键盘输入的整型数,并对数组进行循环赋值。
实现步骤如下:
(1)创建整型数组。
(2)创建Scanner对象。
(3)将循环变量i作为数组下标,循环接收键盘输入,并为数组元素赋值。

int scores[]= new int[5];//创建长度为5的整型数组
Scanner input=new Scanner(System.in);
for(int i=0;i<scores.length;i++){//scores.length等于数组的长度5
	score[i]=input.nextInt();//从控制台接收键盘输入,进行循环赋值
}

该例中使用for循环为数组元素赋值。
例:创建整型数组,循环输出数组元素。
实现步骤如下。
(1)初始化整型数组。
(2)以循环变量i为数组下标,循环输出数组元素。

扫描二维码关注公众号,回复: 11575391 查看本文章
int scores[]={75,67,90,100,0};//创建有5个元素的整型数组
for(int i=0;i<scores.length;i++){//length等于5
		//每次循环i的值相当于数组下标
		System.out.println("scores["+i+"]="+scores[i]);
	}

for(元素类型 变量名:要循环的数组或集合名){…}
第一个元素类型是数组或集合中元素的类型,变量名再循环时用来保存每个元素的值,冒号后面时要循环的数组或集合名称。
例:创建整型数组,使用增强for循环输出数组元素
分析如下。
该语句的含义是依次取出数组a中各个元素的值并赋给整型变量i,同时输出其值。
实现步骤如下。
(1)初始化整型数组。
(2)使用增强for循环。

public class Review1
public static void main(String args[]){
	int []a={1,2,3,4,5};
	for(int i:a){
	System.out.print(i);
	}
}

6.各状态下的数组地址

int[] a=null;
        String[] b=new String[3];//String类型的一个位置,分号后面为其地址。
        char[] c=new char[3];//char类型可直接打印其位置值
        double[] d={1.1,2};
      //  b[3]="abc";//数组索引超出他的范围异常
      //  double ddd=1/0;//0为分母
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);

例题

例1:计算随机输入三十位同学总分、平均分、最大分、最小分,同时打印每个分数

public class Review2{
	public static void main(String args[]){
		int scores[]=new int[30];
            int max=0;
            int min=0;
            System.out.print("成绩为:[");
            for(int i=0;i<scores.length;i++){
                scores[i]=(int) (Math.random()*80+20);//随机输入
                System.out.print(scores[i]+" ");
                    if(scores[i]>max){//计算最大值
                        max=scores[i];
                    }
                    if (scores[i]<min){//计算最小值
                        min=scores[i];
                    }
            }
            System.out.println("]");
            System.out.println("最大值为:"+max);
            System.out.println("最小值为:"+min);
            int sum=0;
            for (int i=0;i<scores.length;i++){
                sum+=scores[i];
            }
            double average= (double) sum/scores.length;
            System.out.println("总分为:"+sum);
            System.out.println("平均分为:"+average);
}

例2:有一组学员的成绩{99,85,82,63, 60},要增加一个学员的成绩,将它插入成绩序列,并保持降序。

  int[] a={99,85,82,63,60};
        int[] b=new int[6];
        for (int i = 0; i < a.length; i++) {
            b[i]=a[i];
        }
        System.out.println(Arrays.toString(b));//转成String,数组遍历
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个数");
        int num=sc.nextInt();
        boolean isInsert=false;//标志
        for (int i = b.length-2; i >=0; i--) {//从后向前走,或者a.length-1
            if (num>b[i]){
                b[i+1]=b[i];//下标后移
            }else {
                b[i+1]=num;
                isInsert=true;
                break;
            }
        }
        if (isInsert==false){//到最后也没地方坐
            b[0]=num;//值插在首位
        }
        System.out.println(Arrays.toString(b));

例3:从数组中删除一个元素

int[] a={99,85,82,63,60};
        int[] b=new int[4];
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要删除的下标:");
        int num=sc.nextInt();
        int j=0;
        for (int i = 0; i < a.length; i++) {
            if (i==num)continue;
            b[i]=a[i];
            j++;//否则i比j少一个
        }
        System.out.println(Arrays.toString(a));

例4:选择排序

 /*选择排序逻辑:
        * 从前向后对每一个下标对应的元素作为基准位
        * 与后面所有的元素进行比较,找出最小值
        * 与当前下标的元素尽心交换
        * 进行下一次循环
        * */
       /* int []a={1,3,2,5,8,4};
        for (int i = 0; i < a.length-1; i++) {//i基准位
            int min=a[i];
            for (int j = i; j < a.length; j++) {
                //j每个在动的
                if (a[i]>a[j]){
                    a[i]=a[j];
                    a[j]=min;
                }
            }
        }
        System.out.println(Arrays.toString(a));*/
        int []a={1,3,2,5,8,4};
        for (int i = 0; i < a.length-1; i++) {//i基准位
            int min=a[i];
            int tmp=i;
            for (int j = i+1; j < a.length; j++) {
                //j每个在动的
                if (a[i]>a[j]){
                    min=a[j];
                    tmp=j;
                }
            }
            a[tmp]=a[i];
            a[i]=min;
        }
        System.out.println(Arrays.toString(a));

例5:插入排序

 /*
        * 逻辑:从第二位开始,向前比较,进行插入逻辑
        * */
        int []a={1,3,2,5,8,4};
        for (int i = 1; i < a.length; i++) {
            int tmp=a[i];
            boolean  isInsert=false;
            for (int j = i-1; j >=0; j--) {
                //如果遇到比自己大的,大的值就后移
                if (tmp<a[j]){
                    a[j+1]=a[j];
                }else {
                //如果遇到比自己小的,就插入
                    a[j+1]=tmp;
                    isInsert=true;
                    break;
                }
            }
            //如果一直没插入,就插首位
            if (!isInsert){//isInsert==false
                a[0]=tmp;
                break;
            }
        }
        System.out.println(Arrays.toString(a));

例6:遍历数组,求和,猜数字

 Scanner sc=new Scanner(System.in);
        System.out.print("请输入一个数:");
        int s=sc.nextInt();
        System.out.print("循环输出:");
        int sum=0;
        int []a= new int[]{8,4,2,1,23,344,12};
        for (int i = 0; i <7 ; i++) {
            System.out.print(+a[i]+" ");
            sum+=a[i];
        }
        System.out.println("和为"+sum);
        for (int i = 0; i <a.length ; i++) {
            if (s==a[i]){
                System.out.println("包含此数");
                break;
            }else {
                System.out.println("不包含此数");
                break;
            }
        }

猜你喜欢

转载自blog.csdn.net/sanjiang521/article/details/107346447
今日推荐