【发布时间】:2018-08-14 14:52:38
【问题描述】:
如果您知道传入的键或至少传入的键数,我已经看到了很多对对象列表进行排序的方法。 问题是在我的情况下,我不知道用户是否会发送 1 个或 10 个密钥。
目前我对每个键的数量都有一个巨大的 switch 语句,但显然它的扩展性非常大。它只是将一堆“thenComparing”链接在一起。
我在这里找到了一个示例,看起来很有帮助,但我不知道如何构建比较器流。
How-to chain and apply a stream of comparators?
寻找一个链接或任何可以填补有关如何做到这一点的空白的信息。
这一切都来自一个调用 web 服务的用户,他们会像这样调用它
https://host.com/path?sort=[{"attribute1": "ASC"}, {"attribute2": "DESC"}]
【问题讨论】:
-
排序的决定因素是什么?例如,这些项目将如何排序:“A”、“B”、“ABC”、“BC”?
-
用户如何告诉你的代码键是什么?
-
你知道
Comparator<Foo> cmp = Comparator.comparing(Foo::getA).thenComparing(Foo::getB).thenComparing(Foo::getC);和Comparator<Foo> cmp = Comparator.comparing(Foo::getA); cmp = cmp.thenComparing(Foo::getB); cmp = cmp.thenComparing(Foo::getC);是一样的,循环起来很容易,对吧? -
@Andreas 总的来说你是对的,问题是将这些字段设置为
Function(我认为这些字段可能是int、String等)......最初我认为关于Map<String, Function<Person, String>> map = new HashMap<>(); map.put("name", Person::getName);并根据密钥获取要提供给Comparator.comparing的Function,但这仅适用于字符串属性 -
@Lino 更简单:) 但你给了
aha moment,谢谢