我在 Java 中有一个 ArrayList,列表中的每个元素都是一个具有 3 个字段(a、b 和 c)的对象。我应该按升序排列;如果 2 个元素对 a 具有相同的值,则它们应按 b 降序排列;最后,如果 2 个元素即使对于 b 也具有相同的值,则它们应该按 c 升序排列。
我尝试了基于 Comparator 在 stackoverflow 上发布的其他解决方案,但我没有按降序排序。
任何人都可以帮助我吗?非常感谢!
我在 Java 中有一个 ArrayList,列表中的每个元素都是一个具有 3 个字段(a、b 和 c)的对象。我应该按升序排列;如果 2 个元素对 a 具有相同的值,则它们应按 b 降序排列;最后,如果 2 个元素即使对于 b 也具有相同的值,则它们应该按 c 升序排列。
我尝试了基于 Comparator 在 stackoverflow 上发布的其他解决方案,但我没有按降序排序。
任何人都可以帮助我吗?非常感谢!
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
,b
或c
是原语int
,long
或double
记得使用comparingInt()
, comparingLong()
, comparingDouble()
,thenComparingInt()
等。
如果与(第一个参数和第二个参数在哪里)进行比较,并且大于,则您Comparator
的 forb
需要返回一个负值。当第一个参数相对较小(在第二个之前)时,A返回负数。由于您希望将具有较大值的元素解释为相对较小,因此从典型的升序比较中反转返回类型。o1
o2
o1
o2
o1.b
o2.b
Comparator
b
Integer
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}]