グアバ注文クックブック

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 ordering = Ordering.natural().onResultOf(Functions.toStringFunction());
List sortedCopy = ordering.sortedCopy(toSort);

List expected = Lists.newArrayList(1, 100, 11, 14, 2, 8);
assertThat(expected, equalTo(sortedCopy));


note:並べ替えロジックは、最初に関数を介して数値を実行し、文字列に変換します。次に、文字列を自然な順序で並べ替えます。

3. その他のグアバ料理本

Guavaは、包括的で非常に便利なライブラリです。クックブック形式でカバーされているAPIがさらにいくつかあります。

楽しい。

4. 結論

この実験的な形式であるクックブックには、明確な焦点(単純さと速度)があるため、ほとんどのレシピにはno additional explanation other than the code example itselfがあります。

そして、前に述べたように–これはa living documentとして–新しい例とユースケースはコメントで歓迎されており、それらに遭遇したときに私自身を追加し続けます。

これらすべての例とコードスニペットcan be found over on GitHubの実装–これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。