有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

需要帮助按第二个元素排序二维数组,然后按第一个元素排序(Java)

我有一个二维数组,里面有5张牌的值。5个数组中的每个数组的第一个元素表示卡的套装,第二个元素表示卡的价值

我想按第二个元素对2d数组排序,然后按第一个元素排序,同时保持第二个元素的排序顺序(如果有意义的话)。例如,在已排序的列表中,一人的所有套装将低于两人的所有套装。例如,{0,1},{2,1},{0,2}}应该变成{0,1},{2,1},{0,2}

以下是我所拥有的:

 // {{3,2}, {2,2}, {0,1}, {1,0}, {2,3}} should become 
 // {{1,0}, {0,1}, {2,2}, {3,2}, {2,3}}

 int[][] hand = {{3,2},{2,2},{0,1},{1,0},{2,3}};
 sort(hand);

 public static void sort(int[][] hand){
    Arrays.sort(hand, new Comparator<int[]>(){
        public int compare(int[] o1, int[] o2){
            return Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1]));
        }
    });
 }

这是输出{1,0},{0,1},{3,2},{2,2},{2,3}。有人有什么建议吗


共 (4) 个答案

  1. # 1 楼答案

    这对你有用吗:

    int compare1 = Integer.valueOf(o1[1]).compareTo(Integer.valueOf(o2[1]);
    if(compare1 != 0)
        return compare1;
    else
        return Integer.valueOf(o1[0]).compareTo(Integer.valueOf(o2[0]));
    
  2. # 2 楼答案

    解决方案1:按第二个元素对数组排序,然后按第一个元素对数组排序。因为Arrays.sort是稳定的,这相当于首先通过第一个元素进行比较,然后通过第二个元素进行比较

    解决方案2:按如下方式修改比较器:

    Arrays.sort(hand, new Comparator<int[]>() {
      public int compare(int[] o1, int[] o2) {
        if (o1[0] == o2[0]) {
          return Integer.compare(o1[1], o2[1]);
        } else {
          return Integer.compare(o1[0], o2[0]);
        }
      }
    });
    

    或者,对于番石榴(披露:我为番石榴做了贡献),您可以将比较指标写为

      public int compare(int[] o1, int[] o2) {
        return ComparisonChain.start()
          .compare(o1[0], o2[0])
          .compare(o1[1], o2[1])
          .result();
      }
    
  3. # 3 楼答案

    您可以这样更紧凑地使用Java8 Comparator

    Arrays.sort(hand, Comparator.comparing(x -> ((int[])x)[1]).thenComparing(x -> ((int[])x)[0]));
    
  4. # 4 楼答案

    我将添加一个Java8解决方案,以防有人想知道

    Arrays.sort(hand, (o1, o2) -> o1[1] == o2[1] ? Integer.compare(o1[0], o2[0]) 
                                                 : Integer.compare(o1[1], o2[1]));
    

    基本上,当第二个元素相等时,它会比较每个数组的第一个元素,否则直接比较第二个元素