Java Comparator 类对数组进行排序
Posted
技术标签:
【中文标题】Java Comparator 类对数组进行排序【英文标题】:Java Comparator class to sort arrays 【发布时间】:2011-07-20 13:53:23 【问题描述】:假设,我们有以下二维数组:
int camels[][] = new int[n][2];
应如何声明 Java Comparator
类以使用 Arrays.sort(camels, comparator)
按数组的第一个元素以降序对数组进行排序?供参考的compare
函数为:
@Override public int compare(int[] a, int [] b)
return b[0] - a[0];
【问题讨论】:
【参考方案1】:[...] 应如何声明 Java Comparator 类以按数组的第一个元素以降序排列 [...]
这是一个使用 Java 8 的完整示例:
import java.util.*;
public class Test
public static void main(String args[])
int[][] twoDim = 1, 2, 3, 7, 8, 9, 4, 2, 5, 3 ;
Arrays.sort(twoDim, Comparator.comparingInt(a -> a[0])
.reversed());
System.out.println(Arrays.deepToString(twoDim));
输出:
[[8, 9], [5, 3], [4, 2], [3, 7], [1, 2]]
对于 Java 7,您可以这样做:
Arrays.sort(twoDim, new Comparator<int[]>()
@Override
public int compare(int[] o1, int[] o2)
return Integer.compare(o2[0], o1[0]);
);
如果您不幸使用 Java 6 或更早版本,您会这样做:
Arrays.sort(twoDim, new Comparator<int[]>()
@Override
public int compare(int[] o1, int[] o2)
return ((Integer) o2[0]).compareTo(o1[0]);
);
【讨论】:
很抱歉提出一个旧线程,但是为什么在返回 compare 方法时需要强制转换为 Integer? @EvolutionaryHigh,因为您不能在int
上调用 .compareTo
。
@Override 注释在 java 5 中也不起作用。***.com/questions/987973/…
天哪。如此小的用例已经从 4 发展到 5 到 6 到 7 到 8 :-) 有点有趣。
我认为 Swift 中的闭包可能会参考这个来制作自己的格式,例如sort() $1 > $2
,关于匿名函数。【参考方案2】:
@aioobe 的回答非常好。我只是想为 Java 8 添加另一种方式。
int[][] twoDim = 1, 2 , 3, 7 , 8, 9 , 4, 2 , 5, 3 ;
Arrays.sort(twoDim, (int[] o1, int[] o2) -> o2[0] - o1[0]);
System.out.println(Arrays.deepToString(twoDim));
对我来说,Java 8 语法直观且易于记忆。
【讨论】:
【参考方案3】:刚试了这个方案,我们连int都不用写了。
int[][] twoDim = 1, 2 , 3, 7 , 8, 9 , 4, 2 , 5, 3 ;
Arrays.sort(twoDim, (a1,a2) -> a2[0] - a1[0]);
这个东西也行,它会自动检测字符串的类型。
【讨论】:
【参考方案4】:这里是日期数组的排序 Arraylist。 也许 smb smwhen 会需要它。
List <Date[]> sortedDateList = new ArrayList<>(/* initialization */);
Collections.sort(sortedDateList, new Comparator<Date[]>()
@Override
public int compare(Date[] d1, Date[] d2)
return (d1[0].compareTo(d2[0]));
);
【讨论】:
【参考方案5】:java.nio.IntBuffer#wrap(int[])
提供了一种出色的内置方法来比较int[]
的两个实例,因为IntBuffer
是int[]
实例的轻量级包装器,和 实现了Comparable
。将它与其他内置 Comparator
功能结合使用与我在此处看到的其他答案中的示例相比有几个优势:
null
数组元素
此示例按降序对数组进行排序,将null
数组元素放在最后:
int[][] twoDim = 1, 2, 3, 7, 8, 9, 4, 2, null, 5, 3, 4;
System.out.println("Unsorted: " + Arrays.deepToString(twoDim));
Comparator<int[]> c = Comparator.nullsFirst(Comparator.comparing(IntBuffer::wrap));
Arrays.sort(twoDim, c.reversed());
System.out.println("Sorted: " + Arrays.deepToString(twoDim));
输出:
Unsorted: [[1, 2], [3, 7], [8, 9], [4, 2], null, [5, 3], [4]]
Sorted: [[8, 9], [5, 3], [4, 2], [4], [3, 7], [1, 2], null]
【讨论】:
以上是关于Java Comparator 类对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
Java排序方法--List,数组,自定义继承Comparable和Comparator