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 }

 

  

  

  

posted @ 2020-10-21 12:58  benon  阅读(214)  评论(0编辑  收藏  举报