メイン

Java アーカイブ

2009年05月05日

Java: Arrays.asList メソッド

車輪を再発明しないというのはプログラミングの世界では常識だが、そのためには既に発明されているものを全て知ってしなければならない。これが意外と難しいことがある。

それはさておき、Java で List を初期化したい場合に、既に Collection があればそれを使って ArrayList のコンストラクタを呼び出すことができる。ではその Collection はどうやって初期化する? JIRO の場合は Spring Framework を使っているので、ArrayList を初期化するのは簡単なのだが、Spring を使わずに初期化する必要がある場合は、Arrays.asList を使う手がある。

Java の API リファレンスには、次のような例が出ている。

List stooges = Arrays.asList("Larry", "Moe", "Curly");

Arrays クラスというのは他にもいろいろな便利なメソッドが用意されているので、知らないと損をしてしまう。

2010年01月27日

Java の for の書き方

List list;

があるときに、次のようなコードを書くのは普通のことだが、

for (Item item: list) {
    foo(list, item);
}

ここでちょっとした罠があって、エラーになってしまうことがある。

Caused by: java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)

何が起こったのか。ループの中で list の要素を入れ替えたのだが、それが気に入らないらしい。これは、次のように old style で書いておけば問題ない。

for (int i = 0; i < list.size(); i++) {
    Item item = list.get(i);
    foo(list, item);
}

これだとその都度 index を使って list から要素を取り出すのだろう。じゃあ先程のは一体何をやっているのか、というのはちょっと気になる。

2010年08月31日

Lucene の TermRangeQuery でハマる

Lucene は Apache がオープンソースで公表している検索エンジンで、有名なので説明はまたの機会にするとして、Lucene を使って範囲指定の絞込みをするときに、TermRangeQuery というクラスを使うのだが、これでちょっとハマってしまったという話。

IDが振られているデータがインデックス化されているとして、 次のようにしてクエリのインスタンスを作った。

TermRangeQuery termRangeQuery = new TermRangeQuery(
	DocumentFactory.FIELD_ID, String.valueOf(fromId),
	String.valueOf(toId), true, false);

ID を範囲で絞ろうというのである。 値は fromId 以上、toId 未満。 最後の true、false は、以上と未満の指定で、最後の値は含まないようにしておく。

これで問題なさそうだが、実際にやってみたらうまく ID を拾えない。 トレースしてみて原因が分かった。 TermRangeQuery が探すのは文字列である。 文字列の順序は数値とは違うのではないか。 20000 と 3 はどちらが大きいか、という話である。

ということで、こういう場合は NumericRangeQuery を使わなければならない。

NumericRangeQuery rangeQuery = NumericRangeQuery.newIntRange(
	DocumentFactory.FIELD_ID,
	Integer.valueOf(fromId), Integer.valueOf(toId),
	true, false);

これで期待通りの範囲の ID を拾い出すことができた。

開発製品

jirologos.gif

About Java

ブログ「三田ブログ」のカテゴリ「Java」に投稿されたすべてのエントリのアーカイブのページです。新しい順番に並んでいます。

前のカテゴリはEclipseです。

次のカテゴリはJIROです。

他にも多くのエントリがあります。メインページアーカイブページも見てください。

Powered by
Movable Type