java - 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序
问题描述
我必须对对象列表进行排序。我必须按值时间对列表进行排序,但是,如果两个或多个事件的时间相等,则必须按其类型对其进行排序。我所寻找的只是一个简单的解决方案,我知道这个解决方案并不简单,并且不会包含任何已经创建的用于排序的类。
预期的列表顺序
#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
我的清单:
#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,
}
推荐阅读
- javascript - 如何使用javascript附加到这个数组
- sql - 如何解决操作数类型冲突:日期与 int 不兼容
- c++ - Libmosquitto 发布不会将所有消息传递到 Azure IoT 中心
- c++ - curl 带进度表的多界面程序
- sql - 这个 SQL 脚本有更简单的版本吗?
- mongodb - 如何在mongo db中获取所有具有对象ID的用户的用户名
- java - 基于java中的属性分组对象列表
- reactjs - 反应错误 - 检查`t`的渲染方法
- sql - Oracle Join Between 以分钟为间隔时间
- cypress - Cypress using JSON fixture in body?