- - PR -
TreeMapについて
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-29 17:44
たびたびスミマセン。
所々間違って送っていました。 書き直さしていただきます。 public int compare(Object o1, Object o2) { RecordSort r1 = (RecordSort)o1; RecordSort r2 = (RecordSort)o2; //int result = r1.busyoNo.compareTo(r2.busyoNo); 間違い int result = r1.todou.compareTo(r2.todou); if(result != 0){ return result; }else{ //return r1.seikyusakiNo.compareTo(r2.seikyusakiNo);間違い return r1.mise.compareTo(r2.mise); } } | ||||||||||||||||
|
投稿日時: 2005-06-29 17:47
Recordインスタンスの値を入れ替えたとしても、
インスタンスそのものに変化はないからです。 以下のようにすれば、当初の期待通りになるでしょうか。
さて、上記のような実装では、キーの保持や選択が面倒そうです。 Recordクラスに収支データのアクセサメソッドを実装して、 // 入れるとき map.put(record.getTodou(),record); // 取り出すとき Record record = (Record)map.get("東京"); こんな感じにするのも一手かと。 [ メッセージ編集済み 編集者: Edosson 編集日時 2005-06-29 17:50 ] | ||||||||||||||||
|
投稿日時: 2005-06-29 18:04
Edosson さんが書かれていますが、少し補足します。
map.put(r,"2000") を実行した段階では、「東京+002+4」のキーに「2000」という値が対応付けられていますが、r を new Record() しないまま使いまわしたため、「2000」の値はそのままにキーだけが「大阪+002+3」に書き換えられてしまっています。 すなわち「大阪+002+3」というキーを持つエントリが二つ存在する状態になり、予期しない結果になったと考えられます。 # 以下蛇足: # こういう掲示板では記事を書いている最中に他の方の投稿があり、内容が前後するのは # ごく普通のことです。特に謝る必要はないと思いますよ ![]() | ||||||||||||||||
|
投稿日時: 2005-06-29 18:07
この方法だと、equalsメソッドを実装しないと取得できないと思います。 (hashCodeメソッドの実装も必要だったっけ・・・?) Javaのオブジェクトは同一性を調べる為にequalsメソッドが存在します。 このメソッドをオーバーライドして、ソート方法の実装同様、 同一性確認の方法を実装する必要があります。 実装しない限り、比較は==で行われます。
みたいな実装が必要になります。 | ||||||||||||||||
|
投稿日時: 2005-06-29 18:28
要件から見ると、がんばってMap実装を使用するより、Compositeパターン
によるツリー構造を作っちゃった方が簡単そうな気がしましたが。 下記コードの出力は 2000 40000 50000 null null になります。
何が起きているかを把握したいなら、デバッガで追ってみてください。 | ||||||||||||||||
|
投稿日時: 2005-06-29 18:32
これについては私も気になり TreeMap クラスの API を調べましたが、以下のような記述があります。 (以下 J2SE 1.4.2 API の TreeMap クラスの説明から第 3 パラグラフを引用; 斜体部は私が入れたものです)
この説明により、ハッシュ系コレクションとは異なり TreeMap では Object#equals(Object) のオーバーライドは不要と考えました。 いかがでしょうか。 | ||||||||||||||||
|
投稿日時: 2005-06-29 18:41
スミマセン。Gioさんに質問なのですが、
一応、putの前にnew Record() をしてみたのですが、 値が同じように出力される結果になってしまいました。 他に原因は何があるでしょうか? ---------------------------------------- while (db.moveNext()){ r = new RecordKey();//newを入れてみました。 //データベースからデータを取得(一意なので被る事はない) r.setTodou(rec.getString("TODOU")); r.setMise(rec.getString("MISE")); r.setGetudo(rec.getString("GETUDO")); map.put(r,value); } r = new RecordKey(); r.setTodou(todou); r.setMise(mise); r.setGetudo(yearMonth);//←強引に値を入れても反応無し System.out.println(map.get(r));//同じ値しか出てこない ---------------------------------------- todouとmiseでは反応しているみたいなのですが、 yearMonthを強引に直書きをしても、 特に反応が無い状態です。 yearMonth="200501" yearMonth="33" などを強制的に入れても、 同じ値(2000)しか出力されない状態です。 | ||||||||||||||||
|
投稿日時: 2005-06-29 19:08
>Gioさん
なるほど。 TreeMapのソースを追っかけてみましたが、 中のEntryクラスはequalsで比較していますね。 これで実装はどうなるんだろう・・・ あとで試してみよう・・・ |