繁体   English   中英

Java,使用比较器对ArrayList进行排序

[英]Java, sorting ArrayList using comparator

我想按两个条件对Task对象列表进行排序。 首先按leftEntryTime排序,然后按timeNeededToBeProcessed

有人能帮我吗?

到目前为止,我确实按leftEntryTime进行了排序,但是如何在同一Comparator类中按timeNeededToBeProcessed进行排序呢?

 Task(int procesID, int neededTime, int waitingTime, int leftEntryTime) {
    this.procesID = procesID;
    this.timeNeededToBeProcessed = neededTime;
    this.waitingTime = waitingTime;
    this.leftEntryTime = leftEntryTime;
 }

这是我的Comparator

import java.util.Comparator;

public class TimeEntryComparator implements Comparator<Task> {

    @Override
    public int compare(Task o1, Task o2) {
        int entryTime;
        int taskTime = o1.getLeftEntryTime()- o2.getLeftEntryTime();

        if (taskTime > 0){
            return 1;
        }

        if (taskTime < 0) {
            return -1;
        }
        return 0;
    }
}

然后按以下顺序排序:

Collections.sort(list, new TimeEntryComparator());

就像是:

public class TimeEntryComparator implements Comparator<Task> {
    @Override
    public int compare(Task o1, Task o2) {
        if (o1.getLeftEntryTime() == o2.getLeftEntryTime())
            return o1.getTimeNeededToBeProcessed() - o2.getTimeNeededToBeProcessed();
        return o1.getLeftEntryTime() - o2.getLeftEntryTime();
    }
}

使用一些新的Java 8功能,它实际上非常简单而优雅:

Comparator<Task> byLeftEntryTime = (t1, t2) -> Integer.compare(t1.getLeftEntryTime(), t2.getLeftEntryTime());
Comparator<Task> byTimeNeededToBeProcessed = (t1, t2) -> Integer.compare(t1.getTimeNeededToBeProcessed(), t2.getTimeNeededToBeProcessed());

list.sort(byLeftEntryTime.thenComparing(byTimeNeededToBeProcessed));

我相信您必须这样做:

@Override
public int compare(Task o1, Task o2) {
    if (o1.getLeftEntryTime() == o2.getLeftEntryTime()) {
        return o1.getTimeNeededToBeProcessed - o2.getTimeNeededToBeProcessed();
    } else {
        return o1.getLeftEntryTime() - o2.getLeftEntryTime();
    }
}

这将通过LeftEntryTime比较Task对象,如果leftEntryTime属性相等,它将比较其timeNeededToBeProcessed属性。

当leftEntryTime值的比较结果为0(即它们相等)时,请继续按timeNeededToBeProcessed进行比较,例如:

@Override
public int compare(Task o1, Task o2) {
    int compare = o1.getLeftEntryTime()- o2.getLeftEntryTime();
    if(compare != 0) {
        return compare;
    }

    return o1.getTimeNeededToBeProcessed() - o2.getTimeNeededToBeProcessed();
}

我想您是说您想按由它们的leftEntryTimetimeNeededToBeProcessed字段组成的复合键对Task对象进行排序。 表示这种排序的Comparator如下所示:

import java.util.Comparator;

public class TimeEntryComparator implements Comparator<Task> {

    @Override
    public int compare(Task o1, Task o2) {
        int entryTime;
        int taskTime = o1.getLeftEntryTime()- o2.getLeftEntryTime();

        if (taskTime > 0){
            return 1;
        } else if (taskTime < 0) {
            return -1;
        } else {
            int neededTime = o1.getTimeNeededToBeProcessed()
                    - o2.getTimeNeededToBeProcessed();

            if (neededTime > 0) {
                return 1;
            } else if (neededTime < 0) {
                return -1;
            } else {
                return 0;
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM