【问题标题】:Java Comparator class to sort arraysJava Comparator 类对数组进行排序
【发布时间】: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];
}

【问题讨论】:

    标签: java arrays multidimensional-array comparator


    【解决方案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 中也不起作用。stackoverflow.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]
          

          【讨论】:

            猜你喜欢
            • 2021-11-14
            • 1970-01-01
            • 2019-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多