Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

TreeSetの拡張をしたい

TreeSet Tに独自クラスCを代入し、
T.add(C)
としたいのです。

Cは
String Word
ArrayList a
を要素としてもち、複数TreeSetにAddされます。


Tの要素CはT内でWordを基準に並べ替えられます。


実行したいことは2つあります。
1
TreeSetから特定のWordをもつCだけを選び出し、
tempC=T.何かのメソッド("test")。
この場合、CのWordに"test"という要素をもつCだけを
tempCに取り出したいのです。

その取り出した要素のaにデータの追加処理をしたい。


一応Wordは重複がなく取り出せる要素は一つとします。

wordは数が多く、取り出し処理は数十万回以上になるの
でそれなりに高速な処理だと嬉しいです。


どの機能を組み合わせて使うかの紹介と、また簡単なサ
ンプルなどがあれば紹介をお願いします。

後、TreeSetよりも他のクラスを使ったほうが良いならそ
のみねお願いします?

6

回答

6951

閲覧

6件の回答

評価

0

一般的にTreeSetは要素取得時に存在しない要素を指定する可能性がある際に用いられます。

例.
TreeSet<String> t = new TreeSet<String>();
t.add("testA");
t.add("testJ");
t.add("testZ");
System.out.println(t.floor("testN"));
System.out.println(t.ceiling("testN"));

---実行結果---
testJ
testZ
--------------

解説.
floorメソッドは引数より小さくて最も近い値の要素を取ってきます。
ceilingメソッドは引数より大きくて最も近い値の要素を取ってきます。
testA < testJ < testN(引数) < testZ


もし、要素を正確に指定できるのなら
HashMapをお勧めします。

HashMapは「キー」に対して「値」を関連付けることでデータを管理します。

例.
HashMap<String,String> map;
map = new HashMap<String,String>();
map.put("test","テスト");
map.put("hoge","ホゲ");
System.out.println(map.get("test"));
System.out.println(map.get("abc"));

---実行結果---
テスト
null
--------------

sさんのケースであれば
HashMap<String,ArrayList> map;
などというようにすれば良いかと思います。

評価

0

HashMapの場合ハッシュ値の衝突が起きるように思えるの
です。
KeyとなるWordが違えば違う値を参照するようにしたいの
です。
異なるWordが同じ場所を指し示す可能性は回避したいの
です。


実は2年ほど前JavaでTreeSetを使い、質問と似たような
処理(もじぴったんと同じ検索を行うチェック処理で辞書
の構築に使った)を作ったことがあるのです。

その後Javaに全く触らず、ソースもどこにいったかわか
らない状態です。

記憶によれば何かきれいに処理する方法があったような
気もするのです。

評価

0

>ハッシュ値の衝突が起きる
衝突した結果、同じ値を指すキーができると思っている?
だったらHashMapが使われることはないだろうなあ。

評価

0

Java以前にアルゴリズムの一般論として、ハッシュテー
ブルを構築する場合の考え方というのがあります。以下
のページに解説があるので掲載しておきます。

アルゴリズムとデータ構造編
http://www.geocities.jp/ky_webid/algorithm/index.ht
ml
第14章 ハッシュ探索(1)(チェイン法)
第15章 ハッシュ探索(2)(オープンアドレス法)

ちなみにJavaのHashMapはチェイン法だそうです。
http://www.mlab.im.dendai.ac.jp/javalib/hash/
http://www.ibm.com/developerworks/jp/java/library/j
-perf09284/index.html

評価

0

ありがとうございます。

JavaのHashMapではHash値が衝突したとき、チェインをたど
ることで別ものになる。

つまり異なるWordはハッシュ値が衝突しても同じ値を指し示
すことは無い。
と理解してよいのでしょうか?

評価

0

そういうこと。
HashMapはハッシュを作ることが目的ではなく、目的とする機能(一対一に結び付ける)を実現するに際して、ハッシュを使っている。
別のスレの話題とも関連するけど、手段より目的(役割)をきちんと把握しよう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。