首页 > 解决方案 > 基于请求的不同属性和基于java中的请求的不同顺序排序(不是重复的)

问题描述

关于按自定义对象的字符串变量排序存在一些问题。我确实跟随他们并使用了比较器。但是,在我的自定义对象中有多个字符串和整数值,我想对具有不同属性的对象进行排序,无论请求什么。我按照这个来对属性进行一一排序。

例如

public class CustomerObj(){
    Integer id;
    String name;
    String city;
    Integer zipCode;
}

每次用户请求时,我只需要按其中一个属性进行排序。除此之外,用户还将询问他们是否希望列表按升序或降序排序。因此,例如,如果我要从 use 请求按 Id 和降序对其进行排序,我将无法传入比较器和 Collections.reverseOrder();

摘要:我想根据请求的任何属性和请求的顺序按不同的属性(不是同时多个属性)进行排序。示例 用户请求按 id 降序排序。回复:

[
   obj{id: 3},
   obj{id: 2},
   obj{id: 1}
]

标签: javaspring-bootsortingcollections

解决方案


可以实现比较器的映射/列表/枚举,然后可以选择单个比较器,例如使用字符串名称:

static Map<String, Comparator<CustomObject>> comparators = Map.of(
    "id", Comparator.comparingInt(CustomObject::getId),
    "id desc", Comparator.<CustomObject>comparingInt(CustomObject::getId).reversed(),
    "name", Comparator.comparing(CustomObject::getName),
    "name desc", Comparator.comparing(CustomObject::getName, Comparator.reverseOrder()),
    "city", Comparator.comparing(CustomObject::getCity),
    "city desc", Comparator.comparing(CustomObject::getCity, Comparator.reverseOrder()),
    "zip", Comparator.comparingInt(CustomObject::getZipCode),
    "zip desc", Comparator.<CustomObject>comparingInt(CustomObject::getZipCode).reversed()
);

然后通过其别名获得适当的比较器:

List<CustomObject> data = Arrays.asList(
    new CustomObject(1, "Jack", "London", 23456),
    new CustomObject(9, "Buck", "Boston", 45678),
    new CustomObject(5, "Kyle", "Jersey", 19876),
    new CustomObject(7, "Stan", "Ashton", 36901)
);

System.out.println("raw list:  " + data);

data.sort(comparators.get("id desc"));
System.out.println("id desc:   " + data);

data.sort(comparators.get("name desc"));
System.out.println("name desc: " + data);

data.sort(comparators.get("zip"));
System.out.println("zip code:  " + data);

输出:

raw list:  [{id=1, name=Jack, city=London, zip=23456}, {id=9, name=Buck, city=Boston, zip=45678}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=7, name=Stan, city=Ashton, zip=36901}]
id desc:   [{id=9, name=Buck, city=Boston, zip=45678}, {id=7, name=Stan, city=Ashton, zip=36901}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}]
name desc: [{id=7, name=Stan, city=Ashton, zip=36901}, {id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}, {id=9, name=Buck, city=Boston, zip=45678}]
zip code:  [{id=5, name=Kyle, city=Jersey, zip=19876}, {id=1, name=Jack, city=London, zip=23456}, {id=7, name=Stan, city=Ashton, zip=36901}, {id=9, name=Buck, city=Boston, zip=45678}]


推荐阅读