6

このような地図があります

Map map=new HashMap();//HashMap key random order.
map.put("a",10);
map.put("a",20);
map.put("a",30);
map.put("b",10);

System.out.println("There are "+map.size()+" elements in the map.");
System.out.println("Content of Map are...");
Set s=map.entrySet();
Iterator itr=s.iterator();
while(itr.hasNext())
{
    Map.Entry m=(Map.Entry)itr.next();
    System.out.println(m.getKey()+"\t"+m.getValue()+"\t"+ m.hashCode());
}

上記のプログラムの出力は

There are 2 elements in the map.
Content of Map are...
b   10  104
a   30  127

今、私はそのキーが次のような複数の値を持つ必要があることを望んでいます

a 10
a 20
a 30

そのため、a によって関連付けられたすべての値を取得する必要があります。どうすれば同じことを達成できるか教えてください。コレクションをネストすることで、キー「a」に 3 つの値すべてを持たせたいと考えています。

4

6 に答える 6

14

Guava Multimapsをチェックアウトしましたか?

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

本当に標準コレクションを使用したい場合 (以下で提案)、キーごとにコレクションを保存する必要があります。

map = new HashMap<String, Collection<Integer>>();

新しいキーを初めて入力するときは、最初の値を追加する前に新しいコレクション ( など)Listを作成する必要があることに注意してください。Set

于 2012-12-05T09:45:12.630 に答える
4

Java 標準ライブラリを使用して必要なものを実装するには、次のようなマップを使用します。

Map<String, Collection<Integer>> multiValueMap = new HashMap<String, Collection<Integer>>();

次に、値を追加できます。

multiValueMap.put("a", new ArrayList<Integer>());
multiValueMap.get("a").add(new Integer(10));
multiValueMap.get("a").add(new Integer(20));
multiValueMap.get("a").add(new Integer(30));

これが不快な場合は、他の人がここで提案しているように、この動作を専用のクラスにラップするか、サードパーティのソリューションを使用することを検討してください ( Guava Multimap )。

于 2012-12-05T09:53:30.093 に答える
2

ArrayListの部分にインスタンスを配置します。

void addValue(Map map, Object key, Object value) {
    Object obj = map.get(key);
    List list;
    if (obj == null) {  
        list = new ArrayList<Object>();  
    } else {
        list = ((ArrayList) obj);
    }
    list.add(value);
    map.put(key, list);
}

詳細については、これを確認してください。

于 2012-12-05T09:46:28.123 に答える
2

ジェネリックパラメーターを無視しないでください。あなたが持っているのは

Map<String, Integer> map = new HashMap<>();

ソリューションを自分でコーディングしたい場合は、

Map<String, List<Integer>> map = new HashMap<>();

とにかく、好ましい方法はグアバマルチマップを使用することです

于 2012-12-05T09:47:29.013 に答える
0

値のリストとして値タイプのマップを使用します。たとえば、マップでエントリを追加するときに、キーを「a」として配置し、必要なすべての値を含む整数のリストとしてその値を追加する必要があります。 、1、2、3、4のように。

于 2012-12-05T09:46:34.633 に答える
0

同じキーを持つエントリを持つマップの場合、使用する意味はありません。ただし、使用するget()限り、iterator()またはentrySet()これが機能するはずです。

class HashMap<String, String> {

  Set<Entry<String, String>> entries;
  @Override
  public Set<Entry<String, String>> entrySet() {
    return entries;
  }

  @Override
  public int size() {
    return entries.size();
  }

  public String put(String key, String value) {
    if (entries == null) {
      entries = new AbstractSet<Entry<String, String>>() {

        ArrayList<Entry<String, String>> list = new ArrayList<>();
        @Override
        public Iterator<Entry<String, String>> iterator() {
          return list.iterator();
        }

        @Override
        public int size() {
          return list.size();
        }

        @Override
        public boolean add(Entry<String, String> stringStringEntry) {
          return list.add(stringStringEntry);
        }
      };
    }
    StatusHandler.MyEntry entry = new StatusHandler.MyEntry();
    entry.setKey(key);
    entry.setValue(value);
    entries.add(entry);
    return value;
  }
};

TL;DR それで、それは何に役立ちますか? これは、フォーム パラメータに基づく複雑なクエリを受け入れるための redmine-java-api へのハックに由来します。

https://stackoverflow.com/a/18358659/848072

https://github.com/albfan/RedmineJavaCLI/commit/2bc51901f2f8252525a2d2258593082979ba7122

于 2016-07-18T14:21:02.397 に答える