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.
9 回答
您可以使用要删除的元素的键从地图中删除条目。
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;
}
这将返回在地图上找到的所有键。
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..
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));
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.
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"
即与指定键关联的先前值。希望能帮助到你。
似乎这里没有人真正回答OP的问题。他们在问如何在不使用迭代器的情况下删除“使用值或键”的条目。如果你有 key当然remove(key)
可以,但如果你正在搜索value则不行。
Alfredo 的答案最接近,因为它搜索 的值侧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));
(用K
andV
代替您的键和值类型。)
使用Map
的remove
方法,它以键为参数。您不需要原始对象;您只需要一个与地图中现有键比较等于的对象equals
,并生成与地图hashCode
中现有键相同的对象。
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"));
}
假设地图有一些条目: 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());