常見異常
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)
定義:
數組可以看成是多個相同類型數據的組合再姑,實現對這些數據的統(tǒng)一管理
元素:數組里的每個值叫做一個元素
索引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循環(huán)打印元素值
@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循環(huán)打印數組的每個值
? ? ? for(int i=0;i<len;i++){
? ? ? System.out.println(a[i]);
? ? ? }
}
第二種創(chuàng)建同時賦值
數組類型? 數組名[ ] = {元素1,元素2交汤,…}
數組類型?數組名[ ] = new 數據類型[ ]{元素1,元素2劫笙,…}
int [] a=new int[]{1,2,3};
int [] a={3,4,5};
學生練習:
用這種方式改造剛才的程序
加強for循環(huán)(以后常用)
格式:
for(數組元素類型? 循環(huán)到的變量命名:? 所循環(huán)的數組名){
?語句;
}
課堂練習
編寫一個長度為5的整型數組芙扎,每個元素賦值為0-10的隨機整數,遍歷該數組填大,輸出每個元素戒洼。
@Test
public void test3(){
int a[]=new int[5];
for(int i=0;i<a.length;i++){
int r=new Random().nextInt(10);
a[i]=r;
}
for(int b:a){
System.out.println(b);
}
}
數組越界異常
ArrayIndexOutOfBoundsException
作業(yè)
1)線上學習多維數組的創(chuàng)建、初始化栋盹、內存模型
2)背冒泡排序
3)今天課堂代碼寫一下
數組的遍歷
因為數組有下標施逾,數組的遍歷本質上是利用數組的下標,循環(huán)下標讀取數據例获。
課堂練習:
學生練習:
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<c.length;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<c.length;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<c.length;i++){
? System.out.println("---->"+c[i]);
}
課堂練習:
1)將一個字符數組的值(neusofteducation)拷貝到另一個字符數組中妓灌。(知識點:數組復制)
2 )給定一個有9個整數(1,6,2,3,9,4,5,7,8)的數組,先排序蜜宪,然后輸出排序后的數組的值虫埂。
冒泡排序:
//冒泡排序
@Test
public void sort(){
int[] a = { 1, 6, 2, 3, 9, 4, 5, 7, 8 };
int len=a.length;
//1、n個數排序圃验,外層的循環(huán)n-1次? i=0~n-1
for(int i=0;i<len-1;i++){//0 ~n-1
//2掉伏、里層循環(huán)j=0~n-1-i次
for(int j=0;j<len-1-i;j++){
//循環(huán)體里比對? 如果a[j]>a[j+1]? 兩個數就交換,大的會被交換到最下面】
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
System.out.println("排序后:");
for(int i=0;i<len;i++){
System.out.println(a[i]);
}
}
@Test
public void sort2(){
int[] a = { 1, 6, 2, 3, 9, 4, 5, 7, 8 };
int len=a.length;
//1、n個數排序斧散,外層的循環(huán)n-1次? i=1~n(不包括n)
for(int i=1;i<len;i++){//1 ~n
//2供常、里層循環(huán)j=0~n-i次
for(int j=0;j<len-i;j++){
//循環(huán)體里比對? 如果a[j]>a[j+1]? 兩個數就交換,大的會被交換到最下面】
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
System.out.println("排序后:");
for(int i=0;i<len;i++){
System.out.println(a[i]);
}
}
二維數組的創(chuàng)建和遍歷
public static void main(String[] args) {
//創(chuàng)建并初始化數組
? ? ? ? //int[][] a=new int[][]{{1,2,3},{4,5,6}};
? ? ? ? int[][] a={{1,2,3},{4,5,6}};
? ? ? ? for(int i=0;i<a.length;i++){
? ? ? ? //a[0]={1,2,3} a[1]={4,5,6}
? ? ? ? for(int j=0;j<a[i].length;j++){
? ? ? ? System.out.println(a[i][j]);
? ? ? ? }
? ? ? ? }}
作業(yè):
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);
}
}
// 循環(huán)打印用戶輸入的成績
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章課后習題
補充:
選擇排序:
//選擇排序
@Test
public void selectSort(){
//原始數據{ 3, 6, 8, 1}
//1源祈、在一個長度為 N 的無序數組中,第一次 假設min=第一個數 遍歷后面 n-1 個數找到最小的和第一個數交換鹿寨。
? ? ? //第一次假設 min=3? { 3, 6, 8, 1};? {1新博,6薪夕,8脚草,3}
//2、第二次從下一個數開始遍歷 n-2 個數原献,找到最小的數和第二個數交換馏慨。
? ? //第二次假設 min=6? {1,6姑隅,8写隶,3};? ==》{1,3讲仰,8慕趴,6};
//3、重復以上操作直到第 n-1 次遍歷最小的數和第 n-1 個數交換鄙陡,排序完成冕房。
? //第三次假設 min=8? {1,3趁矾,8耙册,6};? ==》{1,3毫捣,6详拙,8};
int[] a={ 3, 6, 8,1};
int len=a.length;//4
//n個數,外層循環(huán)n-1次? 0~n-1
for(int i=0;i<len-1;i++){
? //每一次蔓同,先假設當前這個數是最小值
int min=a[i];//a[0],a[1],a[2]
System.out.println("當前假設的最小值為:"+min);
//里層循環(huán)從下一個(i+1)開始到最后一個
for(int j=i+1;j<len;j++){
? ? ? if(a[j]<min){
? ? ? //交換a[j]和min
? ? ? int temp=a[j];
? ? ? a[j]=min;
? ? ? min=temp;
? ? ? }
}
System.out.println("這一軟計算后的最小值為:"+min);
a[i]=min;
}
System.out.println("---------------------------");
for(int i=0;i<len;i++){
System.out.println(a[i]);
}
}