首页 > 解决方案 > 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序

问题描述

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

预期的列表顺序

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

标签: javasorting

解决方案


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

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

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

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

推荐阅读