• Java基础:整型数组(int[]、Integer[])排序


    Windows 10家庭中文版,java version "1.8.0_152",Eclipse Oxygen.1a Release (4.7.1a),

    参考链接:http://www.runoob.com/java/arrays-search.html

    本文是在 抄写 了参考链接中的程序后,发现了一些自己之前不晓得的 基础知识 而写。

    原文提供了 int[]数组 的排序(java.util.Arrays类的sort函数)(默认顺序——升序),排序后,使用java.util.Arrays类的binarySearch查找数组中 已存在的元素,并得到其位置。

    本来自己是想添加 倒序排序 的功能,可是,Arrays类提供的函数中,没有方法对 int[]数组 进行排序,之前知道的sort函数可以有第二个参数——Comparator参数,可是,此参数仅支持引用类型,而int并非应用类型。无法对 int[]数组 进行倒序排序,那么,就对 Integer[]数组 进行倒序排序。

    对 int[]数组 怎么进行倒序排序呢?目前的想法:自己写算法实现,或者,使用Arrays.sort排序后,再使用循环颠倒排序元素。

    下面的代码是第一次实现 Integer[]数组 倒序排序的代码:用到了 java.util.Comparator、匿名内部类,,稍候会对其进行改进。

     1 import java.util.Arrays;
     2 import java.util.Comparator;
     3 
     4 public class SortArray {
     5 
     6     public static void main(String[] args) throws Exception {
     7         int array[] = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4};
     8         Arrays.sort(array);
     9         
    10         printArray("数组排序结果为:", array);
    11         int index = Arrays.binarySearch(array, 2);
    12         System.out.print("元素2在第 " + index + " 个位置");
    13         
    14         // 倒序排列
    15         Integer[] array2 = {2, 5, -2, 6, -3, 8, 0, -7, -9, 4};
    16         Arrays.sort(array2, new Comparator() {
    17 
    18             @Override
    19             public int compare(Object o1, Object o2) {
    20                 Integer e1 = (Integer)o1;
    21                 Integer e2 = (Integer)o2;
    22                 
    23                 return e1 > e2?-1:1;
    24             }
    25             
    26         });
    27         printArray2("数组排序结果为:", array2);
    28     }
    29     
    30     /**
    31      * 打印int型数组
    32      * @param message
    33      * @param array
    34      */
    35     private static void printArray(String message, int[] array) {
    36         System.out.println(message + ": [length = " + array.length + "]");
    37         for (int i = 0; i < array.length; i++) {
    38             if (i != 0) {
    39                 System.out.print(", ");
    40             }
    41             System.out.print(array[i]);
    42         }
    43         System.out.println();
    44     }
    45     
    46     /**
    47      * 打印Integer型数组
    48      * @param message
    49      * @param array
    50      */
    51     private static void printArray2(String message, Integer[] array) {
    52         System.out.println(message + ": [length = " + array.length + "]");
    53         for (int i = 0; i < array.length; i++) {
    54             if (i != 0) {
    55                 System.out.print(", ");
    56             }
    57             System.out.print(array[i]);
    58         }
    59         System.out.println();
    60     }
    61 }

    下图是上面16~26行代码截图:

    可以看出,上面的代码存在警告信息,如下:

    Multiple markers at this line
    	- Comparator is a raw type. References to generic type Comparator<T> should be parameterized
    	- Type safety: The expression of type new Comparator(){} needs unchecked conversion to conform to Comparator<? 
    	 super Integer>
    	- Type safety: Unchecked invocation sort(Integer[], new Comparator(){}) of the generic method sort(T[], Comparator<? 
    	 super T>) of type Arrays

    泛型相关的错误。Comparator接口是一个泛型接口,在使用它的时候,需要指明类型T。虽然编译、运行成功了,但是,还可以更进一步。

    下面是修改后的代码:创建匿名内部类时指定具体类型为Integer。

    Arrays.sort(array2, new Comparator<Integer>() {
    
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 > o2?-1:1;
        }
        
    });

    注意上面代码的红色部分。现在, 没有强制类型转换了,可以直接比较o1、o2,因为它们的类型就是Integer。

    完了吗?没有。还可以改造。更简洁。

    Comparator是一个函数式接口(Functional Interface),因此,可以使用lambda表达式进一步简化(需要Java 8支持)。

    改造后的代码如下:

    1 Arrays.sort(array2, (o1, o2) -> o1 > o2?-1:1);

    wow!一行代码就搞定了!的确很简洁啊!

    以上所有代码的输出结果如下:

    数组排序结果为:: [length = 10]
    -9, -7, -3, -2, 0, 2, 4, 5, 6, 8
    元素2在第 5 个位置数组排序结果为:: [length = 10]
    8, 6, 5, 4, 2, 0, -2, -3, -7, -9

    后记

    还找Java开发呢,先好好练练基础吧!刚刚居然还在lambda表达式里面添加 return,真是笑死自己了!

    写篇博文,让自己记得更牢固一些,而且可以探索更多内容——写博文之前没想过用lambda的,现在用了,满足了。

  • 相关阅读:
    session笔记-韩顺平
    带宽
    cookie-韩顺平
    分层模式开发+MVC模式开发--韩顺平雇员数据库管理
    韩顺平-雇员管理系统-学习小结
    常用的PHP数据库操作方法(MYSQL版)
    使用Three.js 基本组件以及流程
    three.js 相机
    多线程的操作与数据绑定
    矩阵-
  • 原文地址:https://www.cnblogs.com/luo630/p/9860433.html
Copyright © 2020-2023  润新知