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

时间:2012-04-25 17:57:21

标签: java arrays sorting multidimensional-array

我有一个二维数组,它持有5张牌的值。 5个阵列中每个阵列的第一个元素代表卡片的套装,第二个元素代表卡片值。

我希望通过第二个元素对第二个数组进行排序,然后按第一个元素排序,同时保持第二个元素的排序顺序(如果这有意义)。例如,排序列表中的所有套装将比所有两套套装更低。例如,{{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 个答案:

答案 0 :(得分:1)

解决方案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();
  }

答案 1 :(得分:0)

这对你有用吗?

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 :(得分:0)

我将添加Java 8解决方案,以防万一有人想知道。

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

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

答案 3 :(得分:0)

您可以像这样更紧凑地使用Java 8 Comparator

Arrays.sort(hand, Comparator.comparing(x -> ((int[])x)[1]).thenComparing(x -> ((int[])x)[0]));