我必须对对象列表进行排序。我必须按值时间对列表进行排序,但是,如果两个或多个事件的时间相等,那么我必须按其类型对其进行排序。 我所寻找的只是一个简单的解决方案,我知道这个解决方案不会简单,并且不会包含任何已创建的用于排序的类。
预期的列表顺序
#ID , time, type
5 1.1 Arrived
5 1.1 Scheduled
4 1.2 Arrived
3 4.1 Arrived
2 5.4 Arrived
1 6.0 Arrived
5 61.1 Terminated
4 61.1 Scheduled
4 121.1 Terminated
我的 list :
#ID , time, type
5 1.1 scheduled
5 1.1 arrived
4 1.2 arrived
3 4.1 arrived
2 5.4 arrived
1 6.0 arrived
4 61.1 scheduled
5 61.1 terminated
4 121.1 terminated
3 121.1 scheduled
查看代码以使事情变得更好:
private List<Event> createEventList(List<Process> processList) {
List<Event> list = new ArrayList<Event>();
Event event;
for(Process pr : processList) {
// arrived
int id = pr.getID();
double time = pr.getArrivalTime();
eventtype type = eventtype.arrived;
event = new Event(id, time, type);
list.add(event);
//terminated
time = pr.getFinishTime();
type = eventtype.terminated;
event = new Event(id,time,type);
list.add(event);
//scheduled
time = pr.getFinishTime()-pr.getBurstTime();
type = eventtype.scheduled;
event = new Event(id,time,type);
list.add(event);
}
list = list.stream().sorted(Comparator.comparing(Event::getTime))
.collect(Collectors.toList());
return list;
}
编辑:事件类和枚举
public class Event {
private int pID = 0;
private double time = 0.0;
private eventtype type = null;
public static enum eventtype{
arrived,
scheduled,
terminated,
}
public Event(int pID, double time, eventtype type) {
super();
this.pID = pID;
this.time = time;
this.type = type;
}
@Override
public String toString() {
return pID + " " + Math.round(time*10)/10.0 + " " + type.toString();
}
最佳答案
您可以使用thenCompare()
来比较第二个字段,无需再次使用stream()
和collect()
,因为您将结果分配到同一列表中
list.sort(Comparator.comparing(Event::getTime).thenCompare(l ->l.getType().ordinal()));
由于您按枚举类型排序,因此请更改枚举声明中的顺序以按 .ordinal()
排序,否则您需要自己定义比较器。
public static enum eventtype{
terminated,
arrived,
scheduled,
}
关于java - 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61775126/