博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础:整型数组(int[]、Integer[])排序
阅读量:2241 次
发布时间:2019-05-09

本文共 3618 字,大约阅读时间需要 12 分钟。

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             @Override19             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 message33      * @param array34      */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 message49      * @param array50      */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
should be parameterized - Type safety: The expression of type new Comparator(){} needs unchecked conversion to conform to Comparator
- Type safety: Unchecked invocation sort(Integer[], new Comparator(){}) of the generic method sort(T[], Comparator
) of type Arrays

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

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

Arrays.sort(array2, new Comparator
() { @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的,现在用了,满足了。

 

转载于:https://www.cnblogs.com/luo630/p/9860433.html

你可能感兴趣的文章
OpenSSL源代码学习[转]
查看>>
google app api相关(商用)
查看>>
linux放音乐cd
查看>>
GridView+存储过程实现'真分页'
查看>>
flask_migrate
查看>>
解决activemq多消费者并发处理
查看>>
UDP连接和TCP连接的异同
查看>>
hibernate 时间段查询
查看>>
java操作cookie 实现两周内自动登录
查看>>
Tomcat 7优化前及优化后的性能对比
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>