按第一个元素对对象列表排序,如果相等则按第二个元素排序

时间:2020-05-13 12:49:50

标签: java sorting

我必须对对象列表进行排序。我必须按时间值对列表进行排序,但是,如果两个或多个事件的时间相等,则必须按其类型对列表进行排序。 我所寻找的只是一个简单的解决方案,我知道这将不是一个简单的解决方案,并且不会包含任何已创建的用于排序的类。

预期的列表顺序

#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();
    }

2 个答案:

答案 0 :(得分:2)

在比较第一个对象之后,可以使用Comparator#thenComparing比较第二个对象。

list = list.stream().sorted(Comparator.comparing(Event::getTime).thenCompare(Event::getType))
                .collect(Collectors.toList())

答案 1 :(得分:2)

您可以使用thenCompare()比较第二个字段,而无需再次使用stream()collect(),因为您将结果分配在同一列表中

list.sort(Comparator.comparing(Event::getTime).thenCompare(l ->l.getType().ordinal()));

由于您按枚举类型进行排序,因此请更改枚举声明中的顺序以按.ordinal()进行排序,否则您需要自己定义比较器。

public static enum eventtype{
    terminated,
    arrived,
    scheduled,
}