Java 8中的自定义排序映射

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中实现自定义排序?

Art*_*ski 6

您应该在此代码之外的某处定义首选订单.把它放到某种列表中,然后将其转换为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)