1

所以,我有一个HashMap<String, String>

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

我想根据键从中删除一个值。所以可以说我把这些

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

我只想删除其中一个值,而不是整个键集。

我该怎么做呢?如果你还是不明白,这个不存在的方法应该解释一下。

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

显然那不存在,但这就是我想要的。

提前致谢。

4

5 回答 5

10

It seems the easiest solution would be to use some type of List as your value. In this particular case, it might look something like this:

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");

And then to remove a value given a particular key (as shown in your question), you may try something like map.get(key).remove("1_2");

于 2013-08-25T14:00:26.197 回答
1

你可能有put's 参数顺序倒置。不允许重复键。新值(对于同一个键)替换旧值。所以,

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

生成一个只有一个条目的映射:key="1" 和 value="1_2"。相反,

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

生成一个包含 2 个条目的地图。要删除一个条目,您只需要引用它的键,因为它们是唯一的:

frozen.remove("1_2");

如果这没有敲响警钟,那么请更具体地说明数据结构应该包含什么,以及不应该包含什么。一些用例会有所帮助。

于 2013-08-25T14:01:44.697 回答
0

The easiest way to find a solution to such a problem is to consult the JavaDocs: http://docs.oracle.com/javase/7/docs/api/

Find your class there (in your case: java.util.HashMap) and look for the remove method. In this case, you do not need to hand the value to the method (that would be really inefficient). To remove something from a HashMap, simply hand the key to the remove method:

frozen.remove("1");

This will remove the key-value pair "1", "1_2" from the HashMap.

Why will this not remove the first key-value pair? Because the put method overwrites any previous values. To be able to map a key to multiple values, try creating a HashMap with a String and a List:

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

is a possible example.

于 2013-08-25T13:58:48.803 回答
0

我相信您正在尝试将多个字符串映射到一个键。这是可能的,但如果您将密钥映射到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 回答