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 &gt; $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[] 的两个实例,因为IntBufferint[] 实例的轻量级包装器, 实现了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 Comparator 接口排序用法

Java排序方法--List,数组,自定义继承Comparable和Comparator

JAVA中Comparator的使用

java源码之Comparable和Comparator

java Comparable 和 Comparator接口区别

从零开始的Java开发1-6-1 集合排序:对整型和字符串Comparator接口Comparable接口