1

So, I have a HashMap<String, String>

public HashMap<String, String> frozen = new HashMap<String, String>();

and I want to remove a value from it depending on the key. So lets say I put in these

frozen.put("1", "1_1");
frozen.put("1", "1_2");

I want to remove only one of the values, not the whole keyset.

How would I go about doing this? If you still didn't understand, this non-existing method should explain it.

frozen.remove("1", "1_2");

Obviously that doesn't exist, but that's what I want.

Thanks in advance.

4

5 に答える 5

10

最も簡単な解決策は、値として何らかのタイプを使用することListです。この特定のケースでは、次のようになります。

final Map<String, List<String>> map = new HashMap<String, List<String>>();
final String key = "1";
map.put(key, new LinkedList<String>());
map.get(key).add("1_1");
map.get(key).add("1_2");

そして、特定のキーが指定された値を削除するには(質問に示されているように)、次のようなものを試すことができますmap.get(key).remove("1_2");

于 2013-08-25T14:00:26.197 に答える
1

putのパラメータの順序が逆になっている可能性があります。重複キーは許可されていません。新しい値 (同じキーの) は古い値を置き換えます。そう、

frozen.put("1", "1_1");
frozen.put("1", "1_2");

key="1" と value="1_2" の 1 つのエントリのみを持つマップを生成します。それどころか、

frozen.put("1_1", "1" );
frozen.put("1_2", "1" );

2 つのエントリを持つマップを生成します。エントリを削除するには、一意であるため、そのキーを参照するだけで済みます。

frozen.remove("1_2");

これがベルを鳴らさない場合は、データ構造が何を保持し、何を保持しないかをより具体的にしてください。いくつかのユースケースが役立ちます。

于 2013-08-25T14:01:44.697 に答える
0

このような問題の解決策を見つける最も簡単な方法は、JavaDocs: http://docs.oracle.com/javase/7/docs/api/を参照することです。

そこでクラスを見つけ(あなたの場合はjava.util.HashMap)、removeメソッドを探します。この場合、値をメソッドに渡す必要はありません (これは非常に非効率的です)。HashMap から何かを削除するには、単純にキーを remove メソッドに渡します。

frozen.remove("1");

これにより、キーと値のペア"1", "1_2"が HashMap から削除されます。

最初のキーと値のペアが削除されないのはなぜですか? putメソッドは以前の値を上書きするためです。キーを複数の値にマップできるようにするには、文字列とリストで HashMap を作成してみてください。

HashMap<String, ArrayList> frozen = new HashMap<String, ArrayList>();

可能な例です。

于 2013-08-25T13:58:48.803 に答える
0

複数の文字列を 1 つのキーにマップしようとしていると思います。可能ですが、キーをList.

public Map<String, List<String>> frozen = new HashMap<String, List<String>>();

次に、同じキーに複数の値を追加できます

public void addToMappedList(Map<String, List<String>> map,
                                 String key, String value) {
    List<String> existingValues = map.get(key);
    if (existingValues == null) {
        existingValues = new ArrayList<String>();
        map.put(key, existingValues);
    }
    existingValues.add(value);
}

addToMappedList(frozen, "1", "1_1");
addToMappedList(frozen, "1", "1_2");

から個々の値を削除する方法は次のとおりListです。返されるブール値は、 が実際に見つかり、 から削除されたかどうかを示しvalueますList

public boolean removeFromMappedList(Map<String, List<String>> map,
                                         String key, String value) {
    List<String> existingValues = map.get(key);
    if (existingValues != null) {
        return existingValues.remove(value);
    }
    return false;
}

removeFromMappedList(frozen, "1", "1_1"); // true
removeFromMappedList(frozen, "1", "1_3"); // false

Listキー全体とそれに関連付けられているを削除するには、Map直接

frozen.remove("1");
于 2013-08-25T14:06:22.387 に答える
0

あなたがしていることは不可能です。同じキーを使用して別の値を入れることはできません。remove メソッドを使用してエントリを削除できますが、必要なものについては、Guava の MultiMapなどをチェックアウトできます。

値に基づいて本当に削除したい場合は、entrySet() を使用して Map の値を反復処理し、値に基づいて、見つかったキーを使用して remove メソッドを呼び出す必要があります。

于 2013-08-25T13:54:11.483 に答える