无需迭代即可从地图中删除条目

时间:2013-10-17 23:02:43

标签: java dictionary

如何在不使用值或键的迭代的情况下从 Java Map中删除条目。基本上在我的地图中,我使用containsKey()然后使用map.remove()将其删除。

9 个答案:

答案 0 :(得分:16)

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

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;
} 

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

答案 1 :(得分:8)

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..

答案 2 :(得分:5)

在大多数情况下,您可以使用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();
    }
}

Java 8:

map.values().removeIf(v -> v.equals(myValue));

答案 3 :(得分:3)

使用Map#remove(Object key)

public V remove(Object key)
     

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

     

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

基本上你可以调用删除,即使密钥不存在。在这种情况下它会静默失败(返回null)。如果yourKey.equals(key)对于要删除的键为true,则对象不必相同或相同。

答案 4 :(得分:2)

public Object remove(Object key)
remove中的

Map方法。

来自javadoc

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

返回映射先前与关键字关联的值,如果映射不包含此键的映射,则返回null。 (如果实现支持null值,则null返回还可以指示映射先前已将null与指定键关联。)映射将不包含指定键的映射呼叫返回。

<强>参数:

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

<强>返回

与指定键关联的上一个值,如果没有键的映射,则为null

示例:

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

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

答案 5 :(得分:1)

使用Map's remove method,它将一个键作为参数。你不需要原始物体;您只需要一个与地图中现有关键字相等的对象equals,并生成与地图中现有关键字相同的hashCode

答案 6 :(得分:1)

似乎这里没有人真正回答过OP的问题。他们在不使用迭代器的情况下询问如何使用值或键&#34; 删除条目&#34;当然,如果您有密钥,remove(key)可以正常工作,但如果您正在搜索,则无效。

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

以下是使用Java 8 Stream API的解决方案;没有迭代器:

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

(替换KV代替您的键和值类型。)

答案 7 :(得分: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")); }

答案 8 :(得分:-1)

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

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

    List> list = new ArrayList>(map.entrySet());

  • 使用索引获取条目。

    Map.Entry entry = list.get(index);

  • 从地图中删除条目

    map.remove(entry.getKey());