Javaでハッシュテーブルの要素を2つ以上にできるでしょうか?


イメージとしては、

キー:1
値:うま、ひつじ、ねこ

のように、一つのキーに対して、複数の値を持たせたいのですが…。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/14 02:30:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:supermomonga No.1

回答回数17ベストアンサー獲得回数2

ポイント20pt

結論から言うとできません。

ただし、値に配列オブジェクトを使用することで擬似的に再現する、という事は可能です。

挙げられた例では、String型の配列オブジェクトをputしてやればOKですよ。

id:rapuntuleru

なるほど。。。

2010/02/13 20:42:18

その他の回答4件)

id:supermomonga No.1

回答回数17ベストアンサー獲得回数2ここでベストアンサー

ポイント20pt

結論から言うとできません。

ただし、値に配列オブジェクトを使用することで擬似的に再現する、という事は可能です。

挙げられた例では、String型の配列オブジェクトをputしてやればOKですよ。

id:rapuntuleru

なるほど。。。

2010/02/13 20:42:18
id:e55ind No.2

回答回数162ベストアンサー獲得回数4

ポイント20pt

JavaのHashtableのことをいってるのなら、できません。

http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Hashtable....

自前でクラスをつくって実装すればできます。

id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント20pt

出来ないです。


どうしてもという事であれば、

"うま、ひつじ、ねこ" というように1つに合成した形で格納しておいて、

キーで抽出した後に”、”で分割するといったような面倒な事になります。


面倒だからという事で、下記のようにclassを作成して、利用しやすく、

するという手もありますが、必ずしも効率の良い対応とは言えないです。

http://www.atmarkit.co.jp/fjava/javatips/081java010.html


データ量が少ないのであれば、

ハッシュよりもアレイを使う事を考えてみてください。


データ量が多い場合は、バックエンドとしてデータベースを用いるほうが、

効率よく扱えるかもしれませんので、一考してみてください。

(高機能なPostgreSQLやMySQLなどよりも素朴で非常に高速なSQLiteなどは、

 親和性も高く、情報収集も容易です。)

id:km1967 No.4

回答回数541ベストアンサー獲得回数40

ポイント20pt

すでに回答が出ているようにHashtableのみではできません。


代わりにHashMapを使えば比較的簡単にできます。

http://www.atmarkit.co.jp/fjava/javatips/081java010.html


アレイ(Arrayクラスのこと?)やデータベースという的外れな回答が見受けられますが、惑わされないように。

id:b-wind No.5

回答回数3344ベストアンサー獲得回数440

ポイント20pt

ハッシュテーブル

Java では標準でもハッシュテーブルの実装はいくつかある。

特定のどれかを指しているのか違うのか区別がつかん。


言語仕様として存在する訳じゃないからやりようはいくらでもあるだろ。

class ArrayValueHashMap extends HashMap<Object,Array> {
  public void put(Object key, Object value) {
   if ( ! this.containsKey(key) ) {
     super.put(key,new Array());
   }
   super.get(key).add(value);
  }

  public void get(Object key,int index) {
    if ( this.containsKey(key) ) {
     return this.get(key).get(index)
    } else {
     return null;
    }
  }
}

こんなん?


実際はもうちょっと作り込まないとダメだけど。

  • id:supermomonga
    サンプルコードを書こうと思ったのですが誤って途中でポストしてしまいましたので、代わりにここに書いておきますね。

    Hashtable<Integer,String[]> test = new Hashtable<Integer,String[]>();

    String[] list = {"a","b"};
    String[] list2 = {"c","d"};

    test.put(1,list);
    test.put(2,list2);

    System.out.println(test.get(1)[0]);
    System.out.println(test.get(1)[1]);
    System.out.println(test.get(2)[0]);
    System.out.println(test.get(2)[1]);
  • id:kn1967
    >的外れな回答

    リンク先も同じじゃないかw
    方法を示したうえで、「必ずしも効率の良い対応とは言えない」という話をして、
    その延長に他の実装を考慮してみてはという提案のどこが的外れだ?

    kn1967 叩きを続けたいんだろうけど、
    java でコードを書いた事があれば、的外れなどとは書かんぞ。
    私は過去に何度も自分で書いたJAVAのコードを回答してるが、
    km1967 はあるのか? 自分で書けるのか? いいかげんにしろよ。
  • id:supermomonga
    >どうしてもという事であれば、
    >"うま、ひつじ、ねこ" というように1つに合成した形で格納しておいて、
    >キーで抽出した後に”、”で分割するといったような面倒な事になります。

    他の回答者さんのこちらの回答ですが、こういった実装はあまりオススメできません。
    面倒かもしれませんが配列などを入れ子状にして多次元配列風に扱うのが良いでしょう。


    今回はデータの用途や量などが明確でないのでズバリこれが最適!といったアドバイスはできませんが、
    各コレクションフレームワークの違いを把握できれば用途に合った実装方法をチョイスできるはずです。

    http://www.javaroad.jp/java_collection1.htm


    用途やデータ量によっては同回答者さんの言うとおりデータベースを検討してみても良いかもしれません。
  • id:b-wind
    >方法を示したうえで、「必ずしも効率の良い対応とは言えない」という話をして、
    >その延長に他の実装を考慮してみてはという提案のどこが的外れだ?

    とりあえず目的に対してあまり直感的でない回答だとは思うよ。
    質問を見る限り求めているのはあくまで key-value ストア。
    いきなり RDBMS が出てくるのは自分にも理解出来ん。方向性が違いすぎる。
    的外れというのもあながち間違ってはいまい。

    余談だが、どうも感情的になりやすいタイプのようだねぇ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません