为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2023-06-14 13:58:14
我正在尝试根据两个字段 [ Name , Old name ] 按升序对对象列表进行排序,其中Name字段值可以是破折号(“-”),如果名称是破折号,那么它将被添加到列表的末尾. [像下面的顺序:名称:旧名称]SENSITIVE: COMP Operations: COMP OperationsSENSITIVE: Court procedural documents: Court procedural documentsSENSITIVE: Staff matter: Staff MatterSPECIAL HANDLING: ETS Critical: ETS Critical-: ETS Limited-: EU Satellite Navigation matters-: Limited ETS Joint Procurement到目前为止,我得到了以下结果:-: ETS Limited-: EU Satellite Navigation matters-: Limited ETS Joint ProcurementSENSITIVE: COMP Operations: COMP OperationsSENSITIVE: Court procedural documents: Court procedural documentsSENSITIVE: Staff matter: Staff MatterSPECIAL 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 + "]";    }}和解决方案类: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"));任何人都可以给我一些建议,如何将破折号名称对象添加到列表的末尾,其中旧名称应按升序排列。
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


  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;

        });


查看完整回答
反对 回复 2023-06-14
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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


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

        }

    }


查看完整回答
反对 回复 2023-06-14
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信