- PR -

TreeMapについて

投稿者投稿内容
未記入
会議室デビュー日: 2005/06/28
投稿数: 11
投稿日時: 2005-06-28 19:39
私は今、Javaの勉強をしていて、
TreeMapでデータを保持して並べる作業を行いたいと思ったのですが、
プログラムは下記のようになっています。

--------------------------------
List keys;
Map map = new TreeMap();

while(/*【データ分ループ】*/){
keys = new ArrayList();
keys.add(/*【データ取得】*/);//都道府県コード
keys.add(/*【データ取得】*/);//店コード
keys.add(/*【データ取得】*/);//年月
map.put(keys,/*【収支(お金)】*/);//←エラーでおちます(classCastException)
}

//この後TreeMapから値を取り出す・・・
keys = new ArrayList();
keys.add("/*【都道府県コード】*/");
keys.add("/*【店コード】*/");
keys.add("/*【年月】*/");
map.get(keys);
--------------------------------------
このような感じでプログラムを書いているのですが、
2回目のループでclassCastExceptionで落ちてしまいます。
List配列を入れているので、エラーで落ちるのは分かるのですが、
どうしてもキーは3つ入れたいのです。
キーを3つ入れて、TreeMapでソートさせるにはどうすればいいのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-06-28 19:44
TreeMapのキーはComparableを実装したオブジェクトである必要があります。
または、Comparatorを引数にしてインスタンスを生成する必要があります。
TreeMapはデータのソートに使われますが、
どういう条件で比較するのかというのをComparable/Comparatorが受け持ちます。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-06-29 07:10
都道府県コードと店コードと年月を文字列として連結し、それをキーとするといいでしょう。
未記入
会議室デビュー日: 2005/06/28
投稿数: 11
投稿日時: 2005-06-29 09:14
かつのりさんありがとうございました。
かつのりさんのおかげで一応、方向性は分かりました。
現在、作成中ですが、少し難しいです。
何かプログラム例をお見せいただけたら光栄です。
よろしくお願いします。
未記入X
大ベテラン
会議室デビュー日: 2005/05/19
投稿数: 136
投稿日時: 2005-06-29 09:34
こんにちは。
引用:

Anthyhimeさんの書き込み (2005-06-29 07:10) より:
都道府県コードと店コードと年月を文字列として連結し、それをキーとするといいでしょう。


もう、そのもの答えが出てますね。
まだ難しいと仰るならば一度にやろうとするのではなく
「、」で二つに分けてみましょう。

 ○都道府県コードと店コードと年月を文字列として連結する
 ○連結した文字列をキーとする

 もう解りますよね?

#「光栄」なのですか…(滝汗
 ちゃんと送信押す前に推敲してるのかな?辞書ひいてみました?
 自分の手を使って調べてます?


[ メッセージ編集済み 編集者: 未記入 編集日時 2005-06-29 09:35 ]
未記入
会議室デビュー日: 2005/06/28
投稿数: 11
投稿日時: 2005-06-29 09:48
このような形で実験してみました。

--------------------------------------------
public static void main(String[] args) {
TreeMap map = new TreeMap(new ExmComparator());
map.put("01", "1000");
map.put("02", "2000");
map.put("03", "3000");
map.put("04", "4000");

Set set = map.keySet();
Iterator iterator = set.iterator();
Object object;
while (iterator.hasNext()) {
object = iterator.next();
System.out.println(object + " = " + map.get(object));//←データは降順で返ってきました。確認済み。
}
}

public class TestComparator implements Comparator {
public int compare( Object object1, Object object2 ){
//値が何を返しているのか確認
//System.out.println(((Comparable)object1).compareTo( object2 ) * -1);
return ( (Comparable)object1 ).compareTo( object2 ) * -1;
}
}
-------------------------------------------------
そうすると、TestComparatorクラスでは、
-1
-2
-1
-2
-1
と返ってきました。
この値1とか2は何なのでしょうか?

APIには、
「順序付けのために 2 つの引数を比較します。最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数を返します」
と書いてありましたが、1や2とは書いてないので、これが何を意味しているのか?と、
なぜ正の整数や負の整数を返しただけで、並び替えられるのか?がよく分かりません。
よろしくお願いします。

あとスミマセン。一つ前の方は、文字列をつなげるやり方を推奨しているという事ですか?
Comparableは使わないという事なのでしょうか?
もしそうでしたら、スミマセン。
文字列を繋げるやり方はやろうとは思っていないので本当にスミマセン。
あくまでも勉強なので、力技みたいな事は出来るだけ止めようと思っています。
以前もこういうのがあったのですが、あんまり綺麗のロジックだとは思っていなかったので、どうしてもかつのりさんのやり方で行いたいです。
生意気な事を言って本当にスミマセン。
よろしくお願いします。
未記入X
大ベテラン
会議室デビュー日: 2005/05/19
投稿数: 136
投稿日時: 2005-06-29 09:56
引用:

あとスミマセン。一つ前の方は、文字列をつなげるやり方を推奨しているという事ですか?
Comparableは使わないという事なのでしょうか?


1.4のJavadocですが、ここの「既知の実装クラスの一覧」を見てください。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Comparable.html
Comparableを実装しているクラスの中に…String型ありますよね?
引用:

以前もこういうのがあったのですが、あんまり綺麗のロジックだとは思っていなかったので、どうしてもかつのりさんのやり方で行いたいです。
生意気な事を言って本当にスミマセン。


いえいえ。ご自身でやる気が感じられるので全く問題ないですよ。
がんばってください。
未記入
会議室デビュー日: 2005/06/28
投稿数: 11
投稿日時: 2005-06-29 11:31
treeMapクラスの引数に入れるクラスは、
下記のようにしました。
しかし、ロジックが汚すぎるような感があります。
あっているか?もイマイチ分かりません。
出力結果を除いてみると一応、綺麗に昇順で並んでいます。
都道府県コードと店コードの二つで昇順に並んでいればいいので、
二つだけで比較を行っています。
悪い所があれば、何でもよいので指摘お願いします。

-----------------------------------------------------------
TreeMap map = new TreeMap(new ListComparator());

//ListComparatorの比較メソッド
public int compare(Object list1,Object list2) {
int value1 = ((Comparable)((ArrayList)list1).get(0)).compareTo(((ArrayList)list2).get(0));
int value2 = ((Comparable)((ArrayList)list1).get(1)).compareTo(((ArrayList)list2).get(1));

int value3 = 0;
if(value1 > 0 || value2 > 0){
value3 = 1;
}else if(value1 == 0 || value2 == 0){
value3 = 0;
}else if(value1 < 0 || value2 < 0){
value3 = -1;
}
return value3;
}
-------------------------------------------------
よろしくお願いします。

スキルアップ/キャリアアップ(JOB@IT)