Hatena::Groupprogram

ひとり開発日記。 このページをアンテナに追加 RSSフィード

2010/11/17 (Wed)

集合をソートしたい。

| 集合をソートしたい。 - ひとり開発日記。 を含むブックマーク はてなブックマーク - 集合をソートしたい。 - ひとり開発日記。

// 適当な集合
List<Long> list = Arrays.asList(1111L, 22L, null, 3L, 444L);
// 昇順にソート
// …???

簡単なようで、ハマりが多い集合のソートについて。

// これはNG
Collections.sort(list);

まぁ、当然ですよねぇー。 集合にnullが含まれる場合、ぬるぽ発生しちゃいます。 後、Collections#sortが、(所謂)「破壊的メソッド」であることをを忘れて使っちゃったりとか…。

なので、毎度お馴染みguava-librariesを使います。

// 昇順にソート nullが最初に来る
List<Long> sortedCopy = Ordering.natural().nullsFirst().sortedCopy(list);
// 出力
System.out.println(sortedCopy);

結果。

[null, 3, 22, 444, 1111]

これだと、集合にnull入っていてもOK、最初の集合も壊さない、しかも(所謂)「流れるインターフェース*1で分かりやすい、と三拍子揃っているのです。

後、Orderingクラスは、Comparator実装も兼ねているので、こんなことも出来ます。

// 昇順にソート nullが最初に来る Comparatorを作成
Comparator<Long> comparator = Ordering.natural().nullsFirst();

SortedSetを作ったりする時便利ですね。

*1:Martin Fowler's Bliki in Japanese - 流れるようなインターフェース http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface

トラックバック - http://program.g.hatena.ne.jp/halflite/20101117