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

学习者

我对有效使用Java比较器有疑问。

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为活动状态现在,我想编写对进行排序的比较器List<MyClass>,以使活动对象排在最前面,startDate然后由排序,然后是基于进行排序的非活动对象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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDb-如何使用Java对集合中的多个字段进行排序和搜索

如何根据给定条件使用Comparator.comparing()对类进行排序

Java Comparator按多个字段排序,字段数应动态

是否可以使用合并排序(C#)根据多个条件对数组进行排序?

如何使用加权函数对多个字段上的搜索结果进行排序?

在排序期间使用多个字段进行键评估的pythonic方法是什么?

如何使用Go Olivere / Elastic基于多个字段进行排序

如何使用比较器对集合中的多个字段进行排序?

如何在Scala中的多个字段上使用混合的升序和降序对rdd进行排序

如何在Spring Data Web中使用多个字段desc和asc进行排序?

使用sqldf根据多个条件进行计数

使用mongooes在多个字段上对mongo DB进行排序。字段顺序会影响查询结果吗?

按多个字段对Java对象列表进行排序,并按特定字段进行分组

使用多个计数/总和跨多个字段进行透视

如何使用 MongoDB 中的 2 个字段的总和进行排序

使用 TList 类对多个字段重新排序

如何使用区分大小写的多个字段排序

猫鼬使用多个字段查找和排序

如何使用Perl在mongodb中按多个字段排序?

在必须满足所有条件的一个字段上使用多个条件进行查询

如何使用多个排序条件对ArrayList进行排序?

使用多个排序条件对System.Data.DataTable进行排序

使用Comparator和Inner类进行Java排序

如何使用 Java Comparator 对数组进行排序?

使用SQL跨多个字段对输出进行分组

在多个字段上使用$ match进行汇总和$ lookup

使用PDO从多个字段进行高级搜索

Mongoose:使用 $or 进行跨多个字段的部分匹配

在Python中使用熊猫对多个字段进行索引