我有一个很大的HashMap〈String,Object〉项目列表,需要根据字段列表动态排序。
如果字段列表是静态的,我知道我可以很容易地使用Comparator.compare(..)
后跟thenComparing(..)
。
但是,如果我不知道有多少字段以及哪些字段,我就不明白如何根据字段的数量动态链接thenComparion
。
目前我的数据只有字符串,但我希望它以后会更改为其他字段类型,所以这里是一个未来的证明示例:
[
{
"destination": "tokyo",
"origin": "paris",
"model": "speedflight 3000",
"id": 5000047632459593,
"speed": 502.5,
"altitude": 5001,
"time": "2023-01-30T13:35:23Z"
},
....
]
例如,请求可以是按照id, speed, time
的顺序过滤字段,或者也可以只是id
。没有给定排序方向(升序,降序),因此总是使用默认值。
3条答案
按热度按时间mgdq6dx11#
我会改变方法,根据字段列表编写一个普通的Comparator实现,而不是链接
thenComparing()
。或者更好的方法是创建一个自定义类来表示元素,然后使用特定字段将字段名(String)Map到Comparator函数。
您也可以使map静态化,因为它很可能在初始化后就不会更改。
oug3syen2#
您可以创建所有可能的比较器,并将它们存储在一个Map中,使用您的字段名作为键,然后根据输入,您可以合并所需的比较器。
假设你有你的Map和字符串列表中的排序顺序:
将其用作:
如果排序顺序列表为空,则会得到一个
NoSuchElementException
,为了避免这种情况,可以定义一个默认的比较器,而不是盲目地对reduce返回的可选值调用get。bd1hkmkf3#
这可能有助于演示你能做什么。我做了一些数据来方便演示。
将一些函数定义为
keyExtractors
以访问Map信息。现在构建一个比较器,如果两个整数比较结果相同,那么整数将按升序排序,而双精度数则按逆序排序。
印刷品