[英]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();
}
我想您是说您想按由它们的leftEntryTime
和timeNeededToBeProcessed
字段组成的复合键对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.