我想对我的列表进行排序(取自数据库,我不能使用查询进行排序),但是我不知道参数是什么,参数是由用户选择的。下面的代码在desc中按名字和姓氏排序,但是如何创建动态的呢?我做了很多尝试,但都失败了。
myList.sort(Comparator.comparing(DTO::getName)
.thenComparing(DTO::getLastName).reversed());发布于 2020-06-05 17:51:35
要根据用户参数创建自定义订单,我建议如下所示:
1-创建可能排序顺序的枚举,该枚举将由用户查询中的参数填充,例如,我有3个orders BY_ID, BY_NAME, BY_LAST_NAME。
2-然后创建此枚举的列表;
3-之后创建一个映射,其中键是上面的枚举,值是一个比较器。
4-填充地图。
5-从(2)中的订单列表和(3)中的映射导出一个简化的最终比较器。
6-根据最终的比较器对列表进行排序。
将所有步骤放在一起
public enum SortOrder {
BY_ID,
BY_NAME,
BY_LAST_NAME;
}public static void main(String[] args) {
/**dummy objects for test purposes**/
DTO firstDTO = new DTO();
firstDTO.setId(1);
firstDTO.setName("John");
firstDTO.setLastName("Doe");
DTO secondDTO = new DTO();
secondDTO.setId(2);
secondDTO.setName("John");
secondDTO.setLastName("Doe");
DTO thirdDTO = new DTO();
thirdDTO.setId(2); // the id is repeated
thirdDTO.setName("Alice");
thirdDTO.setLastName("Bob");
final List<SortOrder> sortOrders = createSortOrdersFromInputParams(/*the params passed as args*/);
final List<DTO> myList = Arrays.asList(firstDTO, secondDTO, thirdDTO); // your list that is supposed to come from a DB
final Map<SortOrder, Comparator<DTO>> map = new EnumMap<>(SortOrder.class);
final Comparator<DTO> defaultComparator = Comparator.nullsLast(Comparator.comparing(DTO::getId)); // you'all always need a default comparator , say by ID
map.put(SortOrder.BY_ID, defaultComparator);
map.put(SortOrder.BY_NAME, Comparator.nullsLast(Comparator.comparing(DTO::getName)));
map.put(SortOrder.BY_LAST_NAME, Comparator.nullsLast(Comparator.comparing(DTO::getLastName)));
final Comparator<DTO> finalComparator = sortOrders.stream()
.map(map::get)
.filter(Objects::nonNull)
.reduce(Comparator::thenComparing)
.orElse(defaultComparator);
myList.sort(finalComparator);
System.out.println(myList);
} private static List<SortOrder> createSortOrdersFromInputParams(/*params passed as args*/) {
return Arrays.asList(SortOrder.BY_ID, SortOrder.BY_NAME, SortOrder.BY_LAST_NAME);
}我希望这能对你的情况有所回应。
https://stackoverflow.com/questions/62211849
复制相似问题