我正在嘗試使用以下規(guī)則對(duì)列表進(jìn)行排序:已知值應(yīng)排在未知值之前。已知值應(yīng)按單獨(dú)定義的鍵排序。未知值應(yīng)按其自然順序排序。我有 (1) 和 (2),只是在努力將 (3) 添加到組合中。到目前為止,我有這個(gè):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);其中產(chǎn)生:[red, green, blue, orange, yellow, indigo, violet]但是最后 4 個(gè)是按原始順序排列的,而我希望它們按自然順序排序:[red, green, blue, indigo, orange, violet, yellow]我唯一能想到的是編寫我自己的自定義函數(shù),它在地圖中查找內(nèi)容并將地圖結(jié)果添加到原始值,如果未找到則使用地圖大小 - 例如它會(huì)返回:"1-red", "4-orange", "4-yellow", "2-green", "3-blue", "4-indigo", "4-violet"但這僅在映射值是整數(shù)時(shí)才有效,并且需要數(shù)字格式以在“10”之前排序“02”等。任何人都有更好的方法來實(shí)現(xiàn)這一目標(biāo)?
2 回答

慕仙森
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是 Guava 版本(當(dāng)您使用 Java 7 或更低版本時(shí)):
Ordering<String> ordering = Ordering.natural().nullsLast()
.onResultOf(Functions.forMap(map, null))
.compound(Ordering.natural());
這是使用 pure 的非 Guava 版本Comparator(在 JDK 8+ 上時(shí)):
Comparator<String> comparator = Comparator
.<String, Integer>comparing(map::get, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(Comparator.naturalOrder());
附注。如您所見,Guava API 的類型推斷更好(無需指定顯式類型參數(shù))。
添加回答
舉報(bào)
0/150
提交
取消