spa*_*ker 6 java sorting java-8
我有一个如下地图列表.我想在Java 8中按自定义顺序对列表中的映射进行排序.
例如,下面是地图列表.
[{model=Ferrari},
{model=Tesla},
{model=Benz},
{model=Honda}]
Run Code Online (Sandbox Code Playgroud)
如果我使用下面的代码对上面的地图列表进行排序,它按字母顺序排序.
l.sort(Comparator.comparing((Map<String,String> mp) -> mp.get("model")));
Run Code Online (Sandbox Code Playgroud)
给出下面的输出.
[{model = Benz},{model = Ferrari},{model = Honda},{model = Tesla}]
但是我需要根据顺序排序这张地图(非字母顺序): 本田,特斯拉,奔驰,法拉利
有没有更好的方法我们可以在Java 8中实现自定义排序?
您应该在此代码之外的某处定义首选订单.把它放到某种列表中,然后将其转换为modelName - > index的Map.
Map<String,Integer> modelOrder = .....
Run Code Online (Sandbox Code Playgroud)
然后,您可以添加一个查找以获取序数以进行比较.
l.sort(Comparator.comparing((Map<String,String> mp) ->
modelOrder.get(mp.get("model"))));
Run Code Online (Sandbox Code Playgroud)
如果遇到未知模型,这将在你的脸上爆炸.您可以通过类似的方式快速修复
l.sort(Comparator.comparing((Map<String,String> mp) ->
modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE)));
Run Code Online (Sandbox Code Playgroud)
最后放置未知模型,但它们之间不会进行排序(因此即使是同一个未知模型也可能被其他未知模型隔行扫描).
编辑:
正如人们在评论中建议的那样,可以通过.thenComparing很好地解决
l.sort(Comparator
.comparing((Map<String,String> mp) -> modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE))
.thenComparing((Map<String,String> mp) -> mp.get("model")));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1081 次 |
| 最近记录: |