バーニー:
私は、次の規則でリストをソートしようとしています:
- 既知の値は未知の値の前に注文しなければなりません。
- 既知の値は、個別に定義されたキーによって順序付けされなければなりません。
- 不明な値は、その自然の順序で注文する必要があります。
私はミックスにして(3)を追加することに苦しんで、(1)及び(2)を持っています。
これまでのところ私はこれを持っています:
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」に書式番号が必要です
誰もがこれを達成するためのより良い方法がありますか?
トマシュLinkowski:
ここでは(あなたは、Java 7以下にしている)グアバのバージョンがあります:
Ordering<String> ordering = Ordering.natural().nullsLast()
.onResultOf(Functions.forMap(map, null))
.compound(Ordering.natural());
ここでは、純粋な使用して、非グァバのバージョンだComparator
(ときJDK 8+には):
Comparator<String> comparator = Comparator
.<String, Integer>comparing(map::get, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(Comparator.naturalOrder());
PS。あなたが見ることができるように、グアバAPIの場合、型推論は、(明示的な型パラメータを指定する必要はありません)良いです。