第4章 数组(6课时)

常见异常

java.lang.ArrayIndexOutOfBoundsException: 5

at com.neuedu.test.Chap04.test01(Chap04.java:14)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)

at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

定义:

数组可以看成是多个相同类型数据的组合,实现对这些数据的统一管理

元素:数组里的每个值叫做一个元素

索引index:是数据在数组里存放的位置 (编号)  索引从0开始

{1,2,3,4,5}   3的索引为2

数组元素类型:可以是任何类型(四类八种基本类型+引用类型)

分类:

一维数组

 多维数组


一维数组定义

两种定义方式 

1)数组类型  数组名称[]

int a[];

2)数组类型[]  数组名称

int[] b;

给数组指定长度

int a[]=new int[4];

给数组赋值

     //第一种,用下标(索引)方式给数组赋值

      a[0]=56;

      a[1]=45;

      a[2]=18;

      a[3]=11;

      a[4]=9;

学生练习

定义一个长度为5的一维数组,给他赋值 ,并用for循环打印元素值

@Test

public void test1() {

//定义数组的两种方式

      int a[]=new int[5];

      int[] b=new int[5];

      //数组是引用类型 把地址存到栈里,把数据存到堆里

    给数组赋值

      第一种,用下标方式给数组赋值

      a[0]=56;

      a[1]=45;

      a[2]=18;

      a[3]=11;

      a[4]=9;

      //System.out.println(a[2]);

      //得到数组长度

      int len=a.length;

      //for循环打印数组的每个值

      for(int i=0;i

      System.out.println(a[i]);

      }

}

第二种创建同时赋值

数组类型  数组名[ ] = {元素1,元素2,…}

数组类型 数组名[ ] = new 数据类型[ ]{元素1,元素2,…}

int [] a=new int[]{1,2,3};

int [] a={3,4,5};

学生练习:

用这种方式改造刚才的程序

加强for循环(以后常用)

格式:

for(数组元素类型  循环到的变量命名 所循环的数组名){

 语句;

}

课堂练习

编写一个长度为5的整型数组,每个元素赋值为0-10的随机整数,遍历该数组,输出每个元素。

@Test

public void test3(){

int a[]=new int[5];

for(int i=0;i

int r=new Random().nextInt(10);

a[i]=r;

}

for(int b:a){

System.out.println(b);

}

}

数组越界异常

ArrayIndexOutOfBoundsException

作业

1)线上学习多维数组的创建、初始化、内存模型

2)背冒泡排序

3)今天课堂代码写一下

数组的遍历

因为数组有下标,数组的遍历本质上是利用数组的下标,循环下标读取数据。

课堂练习:


学生练习:

1)从键盘输入班级学员成绩,计算全班学员的平均分

2)从键盘输入班级学员成绩,找出全班学员的最高分

数组复制


System.arraycopy(src, srcPos, dest, destPos, length);

//src:从哪里拷 源数组 拷贝谁

  //srcPos:从源数组中的第几个下标开始  源数组中的起始位置

  //dest:目标数组

  //destPos:目标数组中的起始位置

  //length:要复制的数组元素的个数

/**

    * 已知两个一维数组:{1,2,3,4,5}和{6,7,8},将这两个一维数组合并成一个一维数组{1,2,3,4,5,6,7,8}。

    */

@Test

    public void exam04(){

    int[] a={1,2,3,4,5};

    int b[]={6,7,8};

    int c[]=new int[a.length+b.length];

    //src源数组从哪里拷 源数组 拷贝谁

    //srcPos 起始位置的索引号

    //dest 目标数组

    //destPos 放到c的起始位置

    //length拷贝几个

    //把a复制到c里

    System.arraycopy(a, 0, c, 0, a.length);

    //把b复制到c里

    System.arraycopy(b, 0, c, a.length, b.length);

    for(int i=0;i

    System.out.println(c[i]);

    }

    }

数组排序

Arrays.sort(c)  全排

int c[]={4,1,8,9,6,2,1,0};

   Arrays.sort(c);

  for(int i=0;i

  System.out.println(c[i]);

  }

Arrays.sort(c, fromindex, toindex);   从哪个索引到哪个索引处进行排序,其他的不动。

 //从指定位置到终止位置进行排序

  Arrays.sort(c, 3, c.length);

  System.out.println("指定位置排序");

  for(int i=0;i

  System.out.println("---->"+c[i]);

}


课堂练习:

1)将一个字符数组的值(neusofteducation)拷贝到另一个字符数组中。(知识点:数组复制)

2 )给定一个有9个整数(1,6,2,3,9,4,5,7,8)的数组,先排序,然后输出排序后的数组的值。

冒泡排序:

@Test

    public void exam06(){

    int a[]={3,6,2,8,10,99,55,22,0};

    int len=a.length;

    //循环len-1次

    for(int i=1;i

    //第一次 比较len-1次,得到最大的一个a[0]>a[1]? --》a[1]>a[2]......

    //第二次 比较len-2次,得到倒数第二个

    for(int j=0;j

    //如果a[j]>a[j+1]则交换

    if(a[j]>a[j+1]){

    int temp=a[j];

    a[j]=a[j+1];

    a[j+1]=temp;

    }

    }

    }

    //循环打印

    for(int item:a){

    System.out.println(item);

    }

    }

二维数组的创建和遍历

public static void main(String[] args) {

//创建并初始化数组

        //int[][] a=new int[][]{{1,2,3},{4,5,6}};

        int[][] a={{1,2,3},{4,5,6}};

        for(int i=0;i

        //a[0]={1,2,3} a[1]={4,5,6}

        for(int j=0;j

        System.out.println(a[i][j]);

        }

        }}

作业:

1)键盘输入班级学员成绩,计算全班学员每科的平均分     3科    5人

@Test

public void score() {

// 从键盘输入班级学员成绩,计算全班学员每科的平均分 (约定好是3科5人)

Scanner sc = new Scanner(System.in);

int[][] scores = new int[3][5];

while (true) {

// 逐科输入,一共输入3科

label: {

for (int i = 0; i < 3; i++) {// 几科

System.out.println("开始输入第" + i + "科学员成绩");

// 每科输入5个人的

int sum = 0;

for (int j = 0; j < 5; j++) {// 5人

System.out.println("请输入第" + j + "个学员成绩");

int score = sc.nextInt();// 第i科第j个学员成绩

if (score < 0 || score > 100) {

System.out.println("成绩不合法,重头再来");

break label;

}

scores[i][j] = score;

sum += score;

}

// 平均分=每科总成绩/总人数

double avg = sum / 5;

System.out.println("平均成绩" + avg);

}

}

// 循环打印用户输入的成绩

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 5; j++) {

System.out.print(scores[i][j] + "  ");

}

System.out.println();

}

}

}

2)第4章课后习题

你可能感兴趣的:(第4章 数组(6课时))