13

How do I remove entry from Java Map without using iteration using value or key. Basically in my map, I am using containsKey() then map.remove() to remove it.

4

9 回答 9

19

您可以使用要删除的元素的键从地图中删除条目。

map.remove("aKey");

如果您不知道元素的键,则必须迭代以获取它,例如:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
     Set<T> keys = new HashSet<T>();
     for (Entry<T, E> entry : map.entrySet()) {
         if (value.equals(entry.getValue())) {
             keys.add(entry.getKey());
         }
     }
     return keys;
} 

这将返回在地图上找到的所有键。

于 2013-10-17T23:08:15.353 回答
11
Map<Integer, String> abcMap = new HashMap<Integer, String>();
abcMap.put(1,"A");
abcMap.put(2,"B");
abcMap.put(3,"C");

/// now for remove item
abcMap.remove(1);
// this will remove "A" from abcMap..
于 2013-10-17T23:11:30.740 回答
10

Map.remove(key)在大多数情况下,您可以使用方法从映射中删除条目(键值对) 。地图上不会有迭代。你不需要在Map.containsKey(key)之前使用,Map.remove(key)因为Map.remove已经这样做了。它返回先前的关联值,key或者null如果没有key.

但是你不能只使用一个值(没有键)来做同样的事情。唯一的选择是通过 map 迭代并找到具有该值的条目(或条目)。

Java 5-7:

for (Iterator<MyValue> it = map.values.iterator(); it.hasNext(); ) {
    if(it.next().equals(myValue)) {
        it.remove();
    }
}

爪哇 8:

map.values().removeIf(v -> v.equals(myValue));
于 2017-04-13T14:15:14.480 回答
4

Use Map#remove(Object key):

public V remove(Object key)

Removes the mapping for this key from this map if it is present (optional operation). More formally, if this map contains a mapping from key k to value v such that (key==null ? k==null : key.equals(k)), that mapping is removed. (The map can contain at most one such mapping.)

Returns the value to which the map previously associated the key, or null if the map contained no mapping for this key. (A null return can also indicate that the map previously associated null with the specified key if the implementation supports null values.) The map will not contain a mapping for the specified key once the call returns.

Basically you can call remove, even if the key does not exist. It will silently fail in that case(returning null). The object need not be identical or the same, if yourKey.equals(key) is true for the key you want to remove.

于 2013-10-17T23:05:22.023 回答
3
public Object remove(Object key)

remove中的方法Map

javadoc

如果存在,则从此映射中删除此键的映射(可选操作)。更正式地说,如果此映射包含从键 k 到值 v 的映射,(key==null ? k==null : key.equals(k)),则该映射被删除。(地图最多可以包含一个这样的映射。)

返回映射先前与键关联的值,或者null如果映射不包含此键的映射。(如果实现支持值null,则返回还可以指示先前与指定键关联的映射。)一旦调用返回,映射将不包含指定键的映射。nullnull

参数:

key - 要从映射中删除其映射的键。

返回

与指定键关联的先前值,或者null如果键没有映射。

例子:

Map<Integer, String> map=new HashMap<>();
    map.put(20, "stackOverflow");
    System.out.println(map.remove(20));

此代码将打印"stackOverflow"即与指定键关联的先前值。希望能帮助到你。

于 2013-10-17T23:08:03.850 回答
2

似乎这里没有人真正回答OP的问题。他们在问如何在不使用迭代器的情况下删除“使用值或键”的条目。如果你有 key当然remove(key)可以,但如果你正在搜索value则不行。

Alfredo 的答案最接近,因为它搜索 的值侧Map,但它使用迭代器。

这是使用 Java 8 StreamAPI 的解决方案;没有迭代器:

Map<K, V> newMap = map.entrySet().stream()
    .filter(entry -> !entry.getKey().equals(searchValue))
    .filter(entry -> !entry.getValue().equals(searchValue))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

(用KandV代替您的键和值类型。)

于 2015-11-10T13:54:28.460 回答
1

使用Mapremove方法,它以键为参数。您不需要原始对象;您只需要一个与地图中现有键比较等于的对象equals,并生成与地图hashCode中现有键相同的对象。

于 2013-10-17T23:06:05.207 回答
0
public static void main(String[] args) {
    //Constant.mapCustomer.remove("s");
     Map<String, String> mapCustomer=new HashMap<String, String> ();;
     mapCustomer.put("s","ss");
    System.out.println(mapCustomer.get("s"));
    mapCustomer.remove("s");
    System.out.println(mapCustomer.get("s"));
}
于 2017-08-24T10:06:51.143 回答
-2

假设地图有一些条目: Map<Integer,Character> map = new HashMap<>();

  • 要从索引 i 处的映射中删除条目(不进行迭代),您需要将映射 keySet 转换为列表。

    List<Map.Entry<Integer, Character>> list = new ArrayList<Map.Entry<Integer,Character>>(map.entrySet());

  • 使用索引获取条目。

    Map.Entry<Integer, Character> entry = list.get(index);

  • 从地图中删除条目

    map.remove(entry.getKey());

于 2021-04-03T17:31:02.943 回答