未知の値の前に既知の値でリストを並べ替え

バーニー:

私は、次の規則でリストをソートしようとしています:

  1. 既知の値は未知の値の前に注文しなければなりません。
  2. 既知の値は、個別に定義されたキーによって順序付けされなければなりません。
  3. 不明な値は、その自然の順序で注文する必要があります。

私はミックスにして(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の場合、型推論は、(明示的な型パラメータを指定する必要はありません)良いです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=205214&siteId=1