如何动态选择比较器来对数据集合进行排序?

问题描述 投票:0回答:1

所以我有用户输入,这是一个包含 2 个元素的列表,这 2 个元素的顺序可能会改变。如果输入类似于 ["byName", "byAge"],那么我需要首先根据名称对数据集合进行排序,如果两个元素之间存在联系,则按年龄排序。

所以如果输入是

["byName", "byAge"] 

数据是

[{"John", 81}, 
 {"Bob", 81}, 
 {"David", 47}] 

排序输出将是

[{"Bob", 81}, 
 {"David", 47}, 
 {"John", 81}]

同样,如果输入列表像

["byAge", "byName"]
那样颠倒,那么我会按年龄对数据进行排序,并使用名字作为决胜局。

我不确定基于输入动态选择比较器(我需要比较器,因为我需要实现其他自定义比较逻辑)的最简洁方法是什么?最明显的方法是直接检查索引 0 处存在哪个元素,即在某个 lambda 链中,如果

input.get(0) == "byAge"
然后像这样排序。但这并不是真正可扩展的,不是吗?

java java-stream
1个回答
1
投票

您可以按名称创建比较器地图:

Map<String, Comparator<Person>> comparators = new HashMap<>();
comparators.put("byName", Comparator.comparing(Person::getName));
comparators.put("byAge", Comparator.comparing(Person::getAge));

然后将它们链接起来:

List<String> input = Arrays.asList("byName", "byAge");
Comparator<Person> comparator = input.stream()
        .map(comparators::get)
        .reduce(Comparator::thenComparing)
        .orElse((a, b) -> 0);
© www.soinside.com 2019 - 2024. All rights reserved.