天天看点

Day06 数组的使用,冒泡排序,选择排序 可变参数 Arrays数组工具类一 数组二 可变参数 三 Arrays 操作数组工具类  

一 数组

1.使用数组时常用的异常

(1)数组索引越界异常:  ArrayIndexOutOfBoundsException:

索引超出范围

负数索引

(2)空指针异常: NullPointerException

数组的值赋值为null

2.二维数组

数组中嵌套数组

(1)二维数组的声明:

数据类型[ ][ ] 数组名; --推荐使用

数据类型 数组名[ ][ ];

数据类型[ ] 数组名[ ];

(2)二维数组的创建:

数据类型[ ][ ] 数组名=new 数据类型[一维的长度][二维的长度];

数据类型[ ][ ] 数组名=new 数据类型[一维的长度][];

数组名[一维的索引]=new 数据类型[二维的长度];  --创建一维数组的方式都可以

数据类型[ ][ ] 数组名=new 数据类型[ ][ ]{{1,2},{1,2,3},{1},{1,2,3,4}};

(3)二维数组的遍历:

双重for循环

3.数组排序

(1)冒泡排序

每两个数据之间进行比较一次,找出最大的或者最小的进行交换   做升序

Int[ ] arr={5,2,7,8,3};

第一轮: 2,5,7,3,8   比较出最大的数据放在了最后的位置 i=0

第二轮: 2,5,3,7 i=1

第三轮: 2,3,5 i=2

第四轮: 2,3 i=3

这一轮中参与比较数据的个数  arr.length-i

冒泡排序代码

public static int[ ] bubble(int[ ] arr){

//外层循环 i控制比较轮数

for(int i=0;i<arr.length-1;i++){

//m 每一轮中,每两个数据比较,  m,m+1这两个索引位置的数据进行比较

for(int m=0;m<arr.length-i-1;m++){

if(arr[m] > arr[m+1]){

int temp=arr[m];

arr[m]=arr[m+1];

arr[m+1]=temp;

}

}

}

return arr;

}

//遍历int数组

public static void print(int[ ] arr){

for(int i:arr){

System.out.print(i+" ");

}

System.out.println();

}

(2)选择排序

每一轮确定一个主场数据,拿这个数据后它后面的每一个数据去比较,满足条件进行交换,不满足条件不交换

int[] arr={5,2,7,8,3};

第一轮: 索引为0位置作为主场   8,2,5,7,3

第二轮: 索引为1位置作为主场     7,2,5,3

第三轮: 索引为2位置作为主场       5,2,3

第四轮: 索引为3位置作为主场         3,2

一共有arr.length个数据,比较  arr.length-1轮   i :0~arr.length-2

选择排序代码

基本代码

public static int[] choice(int[] arr){

//外层循环i控制轮数,每一轮中作为主场数据的索引数

for(int i=0;i<arr.length-1;i++){

//与主场数据比较的所有数据的索引变化范围

for(int j=i+1;j<=arr.length-1;j++){

if(arr[i] < arr[j]){

int temp=arr[i];

arr[i]=arr[j];

arr[j]=temp;

}

}

}

return arr;

}

优化版本选择排序:

每一轮最多只交换一次,找到最小的或者最大的进行交换

声明一个中间变量,用来存储这一轮中找到的最大的|最小的值的索引

public static int[] choice2(int[] arr){

//外层循环i控制轮数,每一轮中作为主场数据的索引数

for(int i=0;i<arr.length-1;i++){

//与主场数据比较的所有数据的索引变化范围

int max=i;  //假设每一轮作为主场数据都是最大的

for(int j=i+1;j<=arr.length-1;j++){

if(arr[max] < arr[j]){

max=j;

}

}

if(max!=i){

int temp=arr[i];

arr[i]=arr[max];

arr[max]=temp;

}

}

return arr;

}

4.数组过滤

例:将一个整型数组中的0去掉后但会一个新数组.

例如: int[] arr={1,26,0,8,10,50,8,0,7,35,0,4,3,20,0,17};

要求:将以上数组中的0去掉,将不为0的值存入一个新数组,生成新的数组作为返回值.

int newArr={1,26,8,10,50,8,7,35,4,3,20,17};

//返回值:返回数组int   参数:int[]

public static int[] filter(int[] arr){

int count=0; //计数器

//查找不为0数据的个数

for(int i:arr){

if(i!=0){

count++;

}

}

//判断是否存在0

if(count==arr.length){

return arr;

}

//构建新数组  ,根据指定长度

int[] newArr=new int[count];

//遍历原数组把数据方法新数组中

int index=0; //新数组的索引

for(int i=0;i<=arr.length-1;i++){

if(arr[i]!=0){

newArr[index]=arr[i];

index++;

}

}

return newArr;

}

5.获取数组最值

最值:获取数组中的最大值和最小值

public static void getMaxMin(int[] arr){

int max=arr[0]; //假设当前数据就是这个数组中的最大值,并且存储最大值

int min=arr[0]; //假设当前数据就是这个数组中的最小值

for(int i=0;i<=arr.length-1;i++){

if(max<arr[i]){

max=arr[i];

}

if(min>arr[i]){

min=arr[i];

}

}

System.out.println(max);

System.out.println(min);

}

二 可变参数 

1.可变参数的个数可以没有也可以有多个,个数不定但是类型要求相同

2.数据类型 ... 参数名           ...代表可变参数,要写在数据类型和参数名之间

3.可变参数相当于在方法内部创建一个当前类型的数组,所以使用可变参数中的数据要使用数组的方法

4.可变参数写在参数列表的最后位置

三 Arrays 操作数组工具类  

1.使用步骤

(1)导包

//导包

 import java.util.Arrays;

(2)Arrays.方法名(参数);

//1.static String toString(int[] a)  返回指定数组内容的字符串表示形式。

System.out.println(Arrays.toString(arr));

//2.static boolean equals(int[] a, int[] a2)  如果两个指定的 int 型数组彼此相等,则返回 true。

//先比较长度,长度相同再比较内容

System.out.println(Arrays.equals(arr,arr2));

//3.static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

//4.static int binarySearch(int[] a, int key) 二分法查找   如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)

System.out.println(Arrays.binarySearch(arr,10));  //-6

String[] arr3={"因为","吴乐","王强","王涛","肖明"};

//5.static <T> String[] copyOf(T[] original, int newLength) 复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。

System.out.println(Arrays.toString(Arrays.copyOf(arr3,3)));

//6.static <T> String[]  copyOfRange(T[] original, int from, int to)  将指定数组的指定范围复制到一个新数组。  to结束位置索引取不到

System.out.println(Arrays.toString(Arrays.copyOfRange(arr3,1,6)));

boolean[] arr4=new boolean[6];

System.out.println(Arrays.toString(arr4));

//7.static void fill(boolean[] a, boolean val) 将指定的 boolean 值分配给指定 boolean 型数组的每个元素。

//Arrays.fill(arr4,true);

//System.out.println(Arrays.toString(arr4));

//8.static void fill(boolean[] a, int fromIndex, int toIndex, boolean val) 将指定的 boolean 值分配给指定 boolean 型数组指定范围中的每个元素。

//toIndex结束位置索引取不到

Arrays.fill(arr4,1,3,true);

System.out.println(Arrays.toString(arr4));

继续阅读