gpt4 book ai didi

java - 使用 Java Comparator 根据条件使用多个字段进行排序

转载 作者:行者123 更新时间:2023-11-30 02:41:49 27 4
gpt4 key购买 nike

我有一个关于有效使用 Java Comparator 的问题。

class MyClass {
//Active State: OPEN, PENDING, RUNNING
private String state;
private Date startDate;
private Date endDate;
}

这里是 state 的可能值字段有 OPEN、PENDING、RUNNING、CLOSED、CANCELED 等,其中 OPEN、PENDING 和 RUNNING 为 Activity 状态。现在我想编写比较器来对 List<MyClass> 进行排序,以便 Activity 的排在前面,并按 startDate 排序。其次是非 Activity 的,它们根据 endDate 排序.

static final Set<String> ACTIVE;// this set contains OPEN, PENDING, RUNNING

List<MyClass> myList;//This is my list
...
Collections.sort(myList, new Comparator<MyClass>() {
@Override
public int compare(MyClass o1, MyClass o2) {
int c;
boolean isO2 = ACTIVE.contains(o2.getState());
boolean isO1 = ACTIVE.contains(o1.getState());
if (isO2 && isO1) {
c = DateTimeComparator.getInstance().compare(o2.getStartDate(), o1.getStartDate());
} else if (isO2) {
c = 1;
} else if (isO1) {
c = -1;
} else {
c = DateTimeComparator.getInstance().compare(o2.getEndDate(), o1.getEndDate());
}
return c;
}
});

我的问题是我上面的单个比较器的实现是否良好?或者有更好的方法吗?我很可能必须坚持使用 Java 7,但使用 Java 8 的解决方案也很受欢迎。

最佳答案

在Java 8中,我认为使用Comparator::comparing会更干净一些。 。例如:

Comparator<MyClass> comparator = Comparator.nullsFirst(Comparator.comparing((MyClass myClass) -> !isActive(myClass))
.thenComparing((MyClass myClass) -> isActive(myClass) ? myClass.startDate : myClass.endDate, Comparator.nullsFirst(DateTimeComparator.getInstance())));

private static boolean isActive(MyClass myClass)
{
switch (myClass.state)
{
case "OPEN":
case "PENDING":
case "RUNNING":
return true;
default:
return false;
}
}

在 Java 7 中,假设类路径上有 Guava,则可以使用 Ordering 。例如:

Comparator<MyClass> comparator = Ordering.natural().reverse().onResultOf(new Function<MyClass, Boolean>() {
@Override
public Boolean apply(MyClass myClass) {
return isActive(myClass);
}
})
.compound(Ordering.from(DateTimeComparator.getInstance()).nullsFirst().onResultOf(new Function<MyClass, Date>() {
@Override
public Date apply(MyClass myClass) {
return isActive(myClass) ? myClass.startDate : myClass.endDate;
}
}))
.nullsFirst();

关于java - 使用 Java Comparator 根据条件使用多个字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41455049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com