JavaEE-05、13-Java中数组的定义,排序和查找,Array类的引入
数组定义:
存储同一种数据类型的多个元素的集合,也可以看成是一个容器.
数组的格式:
格式1: 数组类型[] 数组名 int[] a //一般采用这种方式定义
格式2: 数据类型 数组名[] int a[] //早期使用这种方式定义
数组初始化:
所谓初始化,就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
动态初始化:初始时只指定数组长度,由系统为数组分配初始值
格式: 数组类型[] 数组名 = new 数据类型[数组长度];
int[] a = new int[3];
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式: 数组类型[] 数组名 = new 数据类型[]{元素1,元素2,......};
int[] a = new int[]{3,4,5,6};
简化写法:int[] a = {3,4,5,6};
注:Java中的数组必须先初始化才能使用.
数组遍历:
依次输出数组中的每一个元素.
遍历数组的方法:
1 public class ArrayTest { 2 public static void main(String[] args) { 3 int[] arr= {11,22,33,44,55}; 4 5 for(int x=0;x<arr.length;x++) { 6 if(x==arr.length-1) {//这是最后一个元素 7 System.out.println(arr[x]); 8 }else { 9 System.out.print(arr[x]+", "); 10 } 11 } 12 } 13 }
数组获取最值:
求取元素随机排序的数组中的最大值或者最小值.
1 public class ArrayTest2 { 2 public static void main(String[] args) { 3 int[] arr = { 34, 98, 10, 25, 67 }; 4 5 int max = arr[0]; 6 for (int x = 1; x < arr.length; x++) { 7 if (arr[x] > max) { 8 max = arr[x]; 9 } 10 } 11 System.out.println("最大值是:"+max); 12 13 int min=arr[0]; 14 for(int x=1;x<arr.length;x++) { 15 if(arr[x]<min) { 16 min=arr[x]; 17 } 18 } 19 System.out.println("最小值是:"+min); 20 } 21 }
数组逆序:
就是把数组中的元素进行对调.
1 public class ArrayTest3 { 2 public static void main(String[] args) { 3 int[] arr = { 12, 98, 50, 34, 76 }; 4 reverse(arr); 5 for (int x = 0; x < arr.length; x++) { 6 if (x == arr.length - 1) { 7 System.out.println(arr[x]); 8 } else { 9 System.out.print(arr[x] + ", "); 10 } 11 } 12 } 13 14 public static void reverse(int[] arr) { 15 for (int x = 0; x < arr.length / 2; x++) {//注意这里的循环次数上限,长度的一半即可,否则又重复了一次对调 16 int temp = arr[x]; 17 arr[x] = arr[arr.length - 1 - x]; 18 arr[arr.length - 1 - x] = temp; 19 } 20 } 21 }
数组元素查找:
在指定数组中查找指定元素的索引.
1 public class ArrayTest5 { 2 public static void main(String[] args) { 3 int[] arr= {200,250,38,888,444}; 4 5 Scanner sc=new Scanner(System.in); 6 System.out.println("请输入需要查找的数:"); 7 int num=sc.nextInt(); 8 if(num>0) { 9 for(int i=0;i<arr.length;i++) { 10 if(num==arr[i]) { 11 System.out.println("该数字在数组中的索引是:"+i); 12 break; 13 } 14 } 15 System.out.println("该数字在数组中不存在!"); 16 }else { 17 System.out.println("请输入正确的数字!"); 18 } 19 } 20 }
数组排序:
1.冒泡排序
思想:相邻元素两两比较,大的往后放,比完一轮后,最大数会被放到末尾。
第二轮比较时,排除末尾的那个最大数,从剩下的数中再次选出最大数,直到排到第一个数为最大。
动图说明:
代码:
1 public static void bubbleSort(int[] arr) { 2 for (int x = 0; x < arr.length - 1; x++) { 3 for (int y = 0; y < arr.length - 1 - x; y++) { 4 if (arr[y] > arr[y + 1]) { 5 int temp = arr[y]; 6 arr[y] = arr[y + 1]; 7 arr[y + 1] = temp; 8 } 9 } 10 } 11 }
2.选择排序
思想:将第1个元素依次与后面的元素进行比较,遇到比第1个元素小的元素,双方进行位置对调。
然后继续在剩余元素中查找最小值,将其放到已排序的数组中的末尾。
重复以上步骤,直到所有元素排序完成。
动图说明:
代码:
1 public static void selectSort(int[] arr) { 2 for (int x = 0; x < arr.length - 1; x++) { 3 for (int y = x + 1; y < arr.length; y++) { 4 if (arr[y] < arr[x]) { 5 int temp = arr[y]; 6 arr[y] = arr[x]; 7 arr[x] = temp; 8 } 9 } 10 } 11 }
举例:利用上面学到的两种排序,将字符串中的字符进行排序
1 public class ArrayTest { 2 public static void main(String[] args) { 3 String s="dacgebf";//定义字符串 4 char[] chs=s.toCharArray();//字符串转换成字符数组 5 bubbleSort(chs);//使用冒泡排序 6 String result=String.valueOf(chs);//字符数组转成字符串 7 System.out.println(result);//遍历冒泡排序后的字符数组 8 selectSort(chs);//使用选择排序 9 System.out.println(result);//遍历选择排序后的字符数组 10 } 11 12 public static void bubbleSort(char[] chs) { 13 for (int x = 0; x < chs.length - 1; x++) { 14 for (int y = 0; y < chs.length - 1 - x; y++) { 15 if (chs[y] > chs[y + 1]) { 16 char temp = chs[y]; 17 chs[y] = chs[y + 1]; 18 chs[y + 1] = temp; 19 } 20 } 21 } 22 } 23 24 public static void selectSort(char[] chs) { 25 for (int x = 0; x < chs.length - 1; x++) { 26 for (int y = x + 1; y < chs.length; y++) { 27 if (chs[y] < chs[x]) { 28 char temp = chs[y]; 29 chs[y] = chs[x]; 30 chs[x] = temp; 31 } 32 } 33 } 34 } 35 }
二分查找:
前面已经介绍过数组元素的查找,是从索引0开始一个一个的查找,直到找到所需的元素为止,这种方法效率较低。
而二分查找是一种效率更高的高级查找,代码如下:
二分查找的重要前提:元素必须是有序的。(没有经过排序的元素是不能乱用二分查找的)
1 public class ArrayDemo { 2 public static void main(String[] args) { 3 int[] arr = { 11, 22, 33, 44, 55, 66, 77 }; 4 int index = getIndex(arr, 9); 5 System.out.println("指定值的索引是:" + index); 6 } 7 8 public static int getIndex(int[] arr, int value) { 9 int max = arr.length - 1; 10 int min = 0; 11 int mid = (min + max) / 2; 12 13 while (arr[mid] != value) { 14 if (arr[mid] > value) { 15 max = mid - 1; 16 } else if (arr[mid] < value) { 17 min = mid + 1; 18 } 19 /*加入判断: 20 * 两种情况,当要求的值特别小时,max值会一直变小,直到比min值还小; 21 * 当要求的值特别大时,min值会一直变大,直到比max值还大。 22 * 这两种情况都可以使用条件(min>max) 23 */ 24 if(min>max) { 25 return -1; 26 } 27 mid = (min + max) / 2; 28 } 29 return mid; 30 } 31 }
Arrays类的引入:
前面我们有说到数组的各种自定义方法,比如遍历、查找、排序,其实这些方法在Arrays类中都有现成的方法可以调用,不需要花时间自己编写。
由此可见,Arrays类就是一个针对数组操作的工具类。
常用方法:
排序 sort(),转成字符串 toString(),二分查找 binarySearch()
特殊方法:
可变参数方法asList()
格式:public static <T> List<T> asList(T. . . a):可把数组转成集合
注意:asList()虽然可将数组Arrays转成集合List,但转换后的本质还是一个数组,数组最大的特点就是长度固定。
所以,转换后的List集合不能增删(即不能调用add和remove方法),只能修改(调用set方法)
1 public class ArrayDemo { 2 public static void main(String[] args) { 3 List<String> list=Arrays.asList("hello","world","java"); 4 5 for(String s:list) { 6 System.out.println(s); 7 } 8 } 9 }