java

您所在的位置:网站首页 用java排序数组 java

java

2024-01-14 21:42| 来源: 网络整理| 查看: 265

一、Arrays.sort

Arrarys.sort()是用于给数组排序的,默认的情况下,是顺序排序,即从小到大:

public class Test5 { public static void main(String[] args) { int[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(arr); for(int x:arr){ System.out.print(x); //print: 0123456789 } } } 二、Arrays.sort逆序排序 2.1  用Comparator进行逆序排序

在开始之前要注意一点:下图我们看一下Comparator的定义,是用了泛型的。泛型本质是引用,是不能传入基本数据类型(如int、long等)的,即T不能为 int 等,即Comparator会报错,要用Integer 代替 int。

而Comparator接口中,包含了一个最核心的方法:int compare() ,这个方法是用于定义排序规则的,如下:

可以看到:

compare的参数o1、o2 也是泛型T,即排序的元素也不能是基本数据类型。

所以若我们需要从小到大排序时,则代码应该这样写:

public class Test5 { public static void main(String[] args) { Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(arr, new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; } }); for(int x:arr){ System.out.print(x); //print: 0123456789 } } }

由于 compare()比较抽象,所以为了方便,我们可以这样把他记住:

int compare(T o1, T o2) 是比较o1和o2的大小

从文档可以得知:如果compare返回值为负数意味着o1比o2小,否则返回为零意味着o1等于o2,返回为正数意味着o1大于o2

所以,当我们需要逆序(大到小排列)的时候,只需要 return o2-o1,即表示 数值越大的数,compare会认为它越小,数值越小的数,compare反而会认为它越大

 

2.2  用 Collections.reverseOrder()进行逆序 public class Test5 { public static void main(String[] args) { Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(arr, Collections.reverseOrder()); for(int x:arr){ System.out.print(x); //print: 9876543210 } } }

可以看到,如果用reverseOrder()的话,数组也是要设置成 Integer的。也是不能用基本数据类型。

 

2.3  用lambda表达式更简介地实现Comparator public class Test5 { public static void main(String[] args) { Integer[] arr = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5}; Arrays.sort(arr, (o1,o2)->{return o2-o1;}); for(int x:arr){ System.out.print(x); //print: 9876543210 } } } 三、用Arrays.sort 进行二维数组排序

要做二维数组排序,其实实际上就是自己用Comparator来定制化排序规则了。

例如,我们现在有如上图的二维数组,想通过每个组合的第一个数来确定组合的位置。

public class Test5 { public static void main(String[] args) { int[][] arr = {{1,9},{2,5},{19,20},{10,11},{12,20},{0,3},{0,1},{0,2}}; Arrays.sort(arr,new Comparator(){ @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; } }); for(int[] a:arr){ System.out.print(a[0]); System.out.print('-'); System.out.print(a[1]); System.out.print(','); //print:0-3,0-1,0-2,1-9,2-5,10-11,12-20,19-20, } } }

这里的数组为什么不用设置成 Interger[][]呢? 因为 int[] 本身就是引用,而不是基本数据类型,所以泛型T是可以为 int[] 的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3