-1

我在 Java 中有一个 ArrayList,列表中的每个元素都是一个具有 3 个字段(a、b 和 c)的对象。我应该按升序排列;如果 2 个元素对 a 具有相同的值,则它们应按 b 降序排列;最后,如果 2 个元素即使对于 b 也具有相同的值,则它们应该按 c 升序排列。

我尝试了基于 Comparator 在 stackoverflow 上发布的其他解决方案,但我没有按降序排序。

任何人都可以帮助我吗?非常感谢!

4

2 回答 2

4

Comparator.reversed() 用于降序

    Comparator<Element> compar = Comparator.comparing(Element::getA)
            .thenComparing(Comparator.comparing(Element::getB).reversed())
            .thenComparing(Element::getC);
    yourArrayList.sort(compar);

除了reversed方法之外,我还利用了thenComparing()重载的事实:一个thenComparing()将 aComparator作为参数,我们需要将其反转,另一个仅将方法引用(或 lambda)作为参数(Function在 的声明中thenComparing())。

如果a,bc是原语int,longdouble记得使用comparingInt(), comparingLong(), comparingDouble(),thenComparingInt()等。

于 2021-08-31T19:58:57.340 回答
0

如果与(第一个参数和第二个参数在哪里)进行比较,并且大于,则您Comparator的 forb需要返回一个负值。当第一个参数相对较小(在第二个之前)时,A返回负数。由于您希望将具有较大值的元素解释为相对较小,因此从典型的升序比较中反转返回类型。o1o2o1o2o1.bo2.bComparatorbInteger

  class Obj {
    int a;
    int b;
    int c;

    Obj(int a, int b, int c) {
      this.a = a;
      this.b = b;
      this.c = c;
    }

    @Override
    public String toString() {
      return "{a: " + a + ", b: " + b + ", c: " + c + "}";
    }
  }

  public void sortObjs() {
    ArrayList<Obj> list = new ArrayList<>();

    list.add(new Obj(0, 1, 2));
    list.add(new Obj(0, 2, 2));
    list.add(new Obj(1, 1, 2));
    list.add(new Obj(1, 1, 1));

    list.sort((o1, o2) -> {
      if (o1.a != o2.a) {
        return o1.a - o2.a;
      }
      //if Objects' a fields are equal but b is not, sort by b in descending order
      if (o1.b != o2.b) {
        return o2.b - o1.b;
      }
      return o1.c - o2.c;
    });

    System.out.println(list);

  }

  public static void main(String[] args) {
    new Main().sortObjs();
  }
}

输出:

[{a: 0, b: 2, c: 2}, {a: 0, b: 1, c: 2}, {a: 1, b: 1, c: 1}, {a: 1, b: 1, c: 2}]
于 2021-08-31T19:42:55.430 回答