1

我有一个二维数组,其中包含 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

4 回答 4

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]);
    }
  }
});

或者,使用 Guava(披露:我为 Guava 做出贡献),您可以将比较器写为

  public int compare(int[] o1, int[] o2) {
    return ComparisonChain.start()
      .compare(o1[0], o2[0])
      .compare(o1[1], o2[1])
      .result();
  }
于 2012-04-25T17:59:41.480 回答
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]));
于 2012-04-25T17:59:35.287 回答
0

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

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

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

于 2018-07-27T01:47:24.953 回答
0

您可以像这样以更紧凑的方式使用 Java 8 Comparator

Arrays.sort(hand, Comparator.comparing(x -> ((int[])x)[1]).thenComparing(x -> ((int[])x)[0]));
于 2020-10-09T03:41:04.387 回答