java - 按第一个元素对对象列表进行排序,但如果相等则按第二个元素排序

标签 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

我的 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/

相关文章:

c++ - 排序排列的算法

C - 按特定列对 3d 字符串数组进行排序

java - 字符串池中将创建多少个对象?

java - Android Studio : errors while running my program

Java 类构造函数 this.id = id 或 this.setId(id)

java - ANT:在生成的 jar 中排序文件

java - 反转二维数组的行

java - 自定义Action Bar如何实现?

r - 对 dist() 的输出进行排序

c++ - 在 C++ 中对二维数组进行排序