1

特定のキーのすべての値 (複数) を取得したいのですが、1 つの値しか取得できませんか?すべての値を出力する方法がわかりません。誰かがコードを修正すると大きな助けになります。 .

import java.util.*;


public class hashing
{
  public static void main(String args[])
  {
       String[] ary=new String[4];
       String key;
       char[] chrary;
       ary[0]=new String("abcdef");
       ary[1]=new String("defabc");
       ary[2]=new String("ghijkl");
       ary[3]=new String("jklghi");
       Hashtable<String, String> hasht = new Hashtable<String, String>(); 
       for(int i=0;i<4;i++){
          chrary=ary[i].toCharArray();
          Arrays.sort(chrary);
          key=new String(chrary);
          hasht.put(key,ary[i]);
       }
       Enumeration iterator = hasht.elements();
    while(iterator.hasMoreElements()) {
      String temp = (String)iterator.nextElement();
      System.out.println(temp);
    }

 }
}

PS: 出力は defabc jklghi です。abcdef defabc ghijkl jklghi が必要です。

4

8 に答える 8

8

ハッシュテーブルには、キーごとに1 つの値のみを含めることができます。複数の値を保存するには、次のいずれかを行う必要があります

  1. キーごとにコレクション (List<String>または配列) を格納します。そのキーに対応する最初の値を挿入する前に、コレクションを初期化する必要があることに注意してください
  2. マルチマップを使用する

多くの MultiMap 実装が存在することに注意してください。Oracle ドキュメントでも簡単な実装が提供されています (こちらを参照し、 MultiMapを検索してください) 。

于 2012-07-03T11:03:00.743 に答える
4

HashMap の仕組みは、特定のキーに対して値が 1 つしかないというものです。したがって、次のように呼び出す場合:

map.put(key, value1);
map.put(key, value2);

2 行目は、キーに対応する値をオーバーライドします。

衝突についてのあなたのコメントに関しては、それは何か違うことを意味します。内部的には、HashMap は、キーのハッシュコードに基づいて定義されたバケットにキーと値のペアを格納します (したがって、名前: ハッシュマップ)。2 つの等しくないキーが同じハッシュコードを持つ (ハッシュコード関数が適切である場合の可能性は低い) 場合、実装では、それらのキーの 1 つでハッシュマップをクエリすると正しい値が返されることを確認する必要があります。ここで、ハッシュの衝突を処理する必要があります。

于 2012-07-03T11:02:16.327 に答える
2

これは、衝突解決の目的ではありません。衝突解決を使用すると、キーが異なる2つのオブジェクトがハッシュマップの同じ「バケット」に入る場合を処理できます。この解決がどのように行われるかは、ハッシュマップ実装の内部の詳細であり、公開されるものではありません。

于 2012-07-03T11:04:09.207 に答える
1

実際、あなたの場合、衝突ではなく、同じハッシュコードを持つ同じキーです。一般に、衝突は、2 つの異なるキーが同じ hashcode を生成するhashCode()場合にのみ発生します。これは、メソッドの実装が不適切なために発生する可能性があります。

はい、java.util.HashMapハッシュ衝突を処理します。 のソース コードを見ると、HashMap各値が に格納されますLinkedList。つまり、同じハッシュコードを持つ 2 つの異なるキーが入ってくると、両方の値が同じバケットに入りますが、linked list.

このリンクをオンラインで見つけて、ハッシュマップの仕組みを詳細に説明しています。

于 2012-07-03T11:23:06.367 に答える
0

ハッシュテーブルは、すべてのMapと同様に、キーごとに1つの値、つまり最後に設定した値のみを保持します。

すべての値を保持する場合は、元の配列を出力するだけです。

String[] ary = "abcdef,defabc,ghijkl,jklghi".split(",");
System.out.println(Arrays.toString(ary));

プリント

[abcdef, defabc, ghijkl, jklghi]
于 2012-07-03T11:04:47.180 に答える
0

キーが同じ場合、値が更新されます。jvm は同じキーに新しいキー/値を配置しません...

于 2012-07-03T11:02:17.230 に答える
0

Hashtable<String, String>1 つの文字列を 1 つの文字列にマップします。そのputため、特定のキーにリンクされる前の値を置き換えます。

複数の値が必要な場合は、Hashtable<String, []String>またはを作成できますHashtable<String, List<String>>

よりクリーンなソリューションは、複数の値を 1 つのキーに関連付けることができるGoogle のMultimapを使用することです。

Map に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。同じキーで異なる値を指定して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。

于 2012-07-03T11:02:31.317 に答える
0

キーごとに文字列を 1 つだけ配置します。

hasht.put(key,ary[i]);

i=1 の場合、 を入力することを意味するのにdefabc、同じキーに対して複数の値を取得することを期待するのはなぜですか?

于 2012-07-03T11:03:13.063 に答える