为了账号安全,请及时绑定邮箱和手机立即绑定

在未知值之前对具有已知值的列表进行排序

在未知值之前对具有已知值的列表进行排序

慕慕森 2021-05-31 15:06:02
我正在尝试使用以下规则对列表进行排序:已知值应排在未知值之前。已知值应按单独定义的键排序。未知值应按其自然顺序排序。我有 (1) 和 (2),只是在努力将 (3) 添加到组合中。到目前为止,我有这个:List<String> values = Arrays.asList(    "red", "orange", "yellow", "green", "blue", "indigo", "violet");ImmutableMap<String, Integer> map = ImmutableMap.of("red", 1, "green", 2, "blue", 3);Ordering<String> order = Ordering.natural()    .nullsLast()    .onResultOf(Functions.forMap(map, null));Collections.sort(values, order);System.out.println(values);其中产生:[red, green, blue, orange, yellow, indigo, violet]但是最后 4 个是按原始顺序排列的,而我希望它们按自然顺序排序:[red, green, blue, indigo, orange, violet, yellow]我唯一能想到的是编写我自己的自定义函数,它在地图中查找内容并将地图结果添加到原始值,如果未找到则使用地图大小 - 例如它会返回:"1-red", "4-orange", "4-yellow", "2-green", "3-blue", "4-indigo", "4-violet"但这仅在映射值是整数时才有效,并且需要数字格式以在“10”之前排序“02”等。任何人都有更好的方法来实现这一目标?
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

这是 Guava 版本(当您使用 Java 7 或更低版本时):


Ordering<String> ordering = Ordering.natural().nullsLast()

        .onResultOf(Functions.forMap(map, null))

        .compound(Ordering.natural());

这是使用 pure 的非 Guava 版本Comparator(在 JDK 8+ 上时):


Comparator<String> comparator = Comparator

        .<String, Integer>comparing(map::get, Comparator.nullsLast(Comparator.naturalOrder()))

        .thenComparing(Comparator.naturalOrder());

附注。如您所见,Guava API 的类型推断更好(无需指定显式类型参数)。


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信