根据具有特殊条件的多个字段对对象列表进行排序

Sorting List of Objects based on multiple fields with Special Criteria

我正在尝试根据两个字段 [名称旧名称] 以升序对对象列表进行排序,其中 Name 字段值可以是破折号(“-”),如果名称是破折号,那么它将被添加到列表的末尾。 [像下面的顺序:名称:旧名称]

SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical
-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement

到目前为止我得到了以下结果:

-: ETS Limited
-: EU Satellite Navigation matters
-: Limited ETS Joint Procurement
SENSITIVE: COMP Operations: COMP Operations
SENSITIVE: Court procedural documents: Court procedural documents
SENSITIVE: Staff matter: Staff Matter
SPECIAL HANDLING: ETS Critical: ETS Critical

领域模型:

class Marking {
    String name;
    String oldName;

    public Marking(String name, String oldName) {
        this.name = name;
        this.oldName = oldName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOldName() {
        return oldName;
    }

    public void setOldName(String oldName) {
        this.oldName = oldName;
    }

    @Override
    public String toString() {
        return "Marking [name=" + name + ", oldName=" + oldName + "]";
    }
}

和解决方案Class:

public class Solution {
    public static void main(String[] args) {
        List<Marking> markings = new ArrayList<>();
        markings.add(new Marking("-", "Limited ETS Joint Procurement"));
        markings.add(new Marking("-", "EU Satellite Navigation matters"));
        markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
        markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
        markings.add(new Marking("-", "ETS Limited"));
        markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
        markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));

        Collections.sort(markings, new Comparator<Marking>() {
            @Override
            public int compare(Marking o1, Marking o2) {
                int value = o1.getName().compareToIgnoreCase(o2.getName());
                if(value == 0) {
                    return o1.getOldName().compareToIgnoreCase(o2.getOldName());
                }
                return value;
            }
        });


        for (Marking marking : markings) {
            System.out.println(marking.getName() + ": " + marking.getOldName());
        }
    }
}

任何人都可以给我一些建议,我怎样才能将破折号名称对象添加到列表的末尾,其中旧名称应按升序排列。

这是一个建议。顺序是 fine,我们所做的就是取出所有以“-”开头的元素并将它们从列表中删除,然后在末尾添加回来。这是低效的,但它是一种决心。

    public static void main(String[] args) {
        List<Marking> markings = new ArrayList<>();

        markings.add(new Marking("-", "Limited ETS Joint Procurement"));
        markings.add(new Marking("-", "EU Satellite Navigation matters"));
        markings.add(new Marking("SENSITIVE: Court procedural documents", "Court procedural documents"));
        markings.add(new Marking("SENSITIVE: COMP Operations", "COMP Operations"));
        markings.add(new Marking("-", "ETS Limited"));
        markings.add(new Marking("SENSITIVE: Staff matter", "Staff Matter"));
        markings.add(new Marking("SPECIAL HANDLING: ETS Critical", "ETS Critical"));


        markings.sort((o1, o2) -> {
            int value = o1.getName().compareToIgnoreCase(o2.getName());

            if (value == 0) {
                return o1.getOldName().compareToIgnoreCase(o2.getOldName());
            }
            return value;
        });

        List<Marking> dashed = markings.stream().filter(marking -> marking.name.startsWith("-") || marking.oldName.startsWith("-"))
                .collect(Collectors.toList());

        markings.removeAll(dashed);

        markings.addAll(dashed);

        for (Marking marking : markings) {
            System.out.println(marking.getName() + ": " + marking.getOldName());
        }
    }

这是我很快想到的一个选项:

  Collections.sort(markings, (o1, o2) -> {

            int value = o1.getName().compareToIgnoreCase(o2.getName());
            if(value == 0) {
                return o1.getOldName().compareToIgnoreCase(o2.getOldName());
            }

            if(o1.getName().equals("-")) {
                return 1;
            }
            if(o2.getName().equals("-")) {
                return -1;
            }

            return value;
        });