Guava Ordering Cookbook
1. 前書き
このクックブックはhow to use the Guava style Ordering and Comparatorsを示しています。 the previous post about Guava collectionsで開始したクックブックとサンプルフォーカスフォーマットを継続しています。
2. クックブック
コレクション内のnullの処理
最初にnull
List toSort = Arrays.asList(3, 5, 4, null, 1, 2);
Collections.sort(toSort, Ordering.natural().nullsFirst());
assertThat(toSort.get(0), nullValue());
最後にnull
List toSort = Arrays.asList(3, 5, 4, null, 1, 2);
Collections.sort(toSort, Ordering.natural().nullsLast());
assertThat(toSort.get(toSort.size() - 1), nullValue());
自然順序付け
List toSort = Arrays.asList(3, 5, 4, 1, 2);
Collections.sort(toSort, Ordering.natural());
assertTrue(Ordering.natural().isOrdered(toSort));
2つの注文を連鎖させる
List toSort = Arrays.asList(3, 5, 4, 1, 2);
Collections.sort(toSort, Ordering.natural().reverse());
順序を逆にする
List toSort = Arrays.asList(3, 5, 4, null, 1, 2);
Collections.sort(toSort, Ordering.natural().nullsLast().reverse());
assertThat(toSort.get(0), nullValue());
カスタムオーダー–長さによる文字列
private class OrderingByLenght extends Ordering {
@Override
public int compare(String s1, String s2) {
return Ints.compare(s1.length(), s2.length());
}
}
List toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering byLength = new OrderingByLenght();
Collections.sort(toSort, byLength);
Ordering expectedOrder = Ordering.explicit(Lists.newArrayList("b", "zz", "aa", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort))
明示的な順序の確認
List toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering byLength = new OrderingByLenght();
Collections.sort(toSort, byLength);
Ordering expectedOrder = Ordering.explicit(Lists.newArrayList("b", "zz", "aa", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort));
文字列の順序を確認する
List toSort = Arrays.asList(3, 5, 4, 2, 1, 2);
Collections.sort(toSort, Ordering.natural());
assertFalse(Ordering.natural().isStrictlyOrdered(toSort));
二次注文
List toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering byLength = new OrderingByLenght();
Collections.sort(toSort, byLength.compound(Ordering.natural()));
Ordering expectedOrder = Ordering.explicit(Lists.newArrayList("b", "aa", "zz", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort));
複雑なカスタム注文の例–チェーン付き
List toSort = Arrays.asList("zz", "aa", null, "b", "ccc");
Collections.sort(toSort,
new OrderingByLenght().reverse().compound(Ordering.natural()).nullsLast());
System.out.println(toSort);
toString表現を使用してソート
List toSort = Arrays.asList(1, 2, 11);
Collections.sort(toSort, Ordering.usingToString());
Ordering expectedOrder = Ordering.explicit(Lists.newArrayList(1, 11, 2));
assertTrue(expectedOrder.isOrdered(toSort));
並べ替えてから検索(二分探索)
List toSort = Arrays.asList(1, 2, 11);
Collections.sort(toSort, Ordering.usingToString());
int found = Ordering.usingToString().binarySearch(toSort, 2);
System.out.println(found);
ソートせずに最小/最大を見つける(より速く)
List toSort = Arrays.asList(2, 1, 11, 100, 8, 14);
int found = Ordering.usingToString().min(toSort);
assertThat(found, equalTo(1));
注文からリストのソートされたコピーを作成する
List toSort = Arrays.asList("aa", "b", "ccc");
List sortedCopy = new OrderingByLenght().sortedCopy(toSort);
Ordering expectedOrder = Ordering.explicit(Lists.newArrayList("b", "aa", "ccc"));
assertFalse(expectedOrder.isOrdered(toSort));
assertTrue(expectedOrder.isOrdered(sortedCopy));
ソートされた部分コピーの作成–最小の要素
List toSort = Arrays.asList(2, 1, 11, 100, 8, 14);
List leastOf = Ordering.natural().leastOf(toSort, 3);
List expected = Lists.newArrayList(1, 2, 8);
assertThat(expected, equalTo(leastOf));
仲介機能による注文
List toSort = Arrays.asList(2, 1, 11, 100, 8, 14);
Ordering
–note:並べ替えロジックは、最初に関数を介して数値を実行し、文字列に変換します。次に、文字列を自然な順序で並べ替えます。
3. その他のグアバ料理本
Guavaは、包括的で非常に便利なライブラリです。クックブック形式でカバーされているAPIがさらにいくつかあります。
楽しい。
4. 結論
この実験的な形式であるクックブックには、明確な焦点(単純さと速度)があるため、ほとんどのレシピにはno additional explanation other than the code example itselfがあります。
そして、前に述べたように–これはa living documentとして–新しい例とユースケースはコメントで歓迎されており、それらに遭遇したときに私自身を追加し続けます。
これらすべての例とコードスニペットcan be found over on GitHubの実装–これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。