我正在创建一个存储一些数据的Map,如果尝试插入重复值,我希望地图抛出异常。
Map <Integer, String> temp;
temp.put(1, "hi");
temp.put(1, "hello");
此处此映射应抛出错误,因为密钥“1”已存在。 它可能会抛出错误或无法编译。 是否有任何具有所述功能的地图?
答案 0 :(得分:1)
检查containsKey方法。
Map<Integer, String> map = new LinkedHashMap<>();
map.put(1, "Value");
if (map.containsKey(1)) {
throw new Exception("Map already contains key 1");
}
对于您的问题,您可以创建自己的实现,如:
public class MyCustomMap extends HashMap {
@Override
public Object put(Object key, Object value) {
if (this.containsKey(key)) {
System.out.println("Do whatevery you want when key exists.");
return null;
} else {
return super.put(key, value);
}
}
}
然后使用它:
public static void main(String[] args) throws Exception {
Map<Integer, String> map = new MyCustomMap();
map.put(1, "Value");
map.put(1, "Another value");
}
注意:这是示例,没有空检查等。
但是请在此之前尝试检查JavaDoc或基本数据结构用例,我相信在Google上有很多例子;)
答案 1 :(得分:0)
Map.put返回与key关联的先前值,如果有则返回null 没有密钥的映射。 (null返回也可以指示地图 如果实现支持,则先前将key与key关联 空值。)
所以你可以这样做:
public void addItem ( Integer key, String value ) throws Exception {
String old = map.put( key, value );
if ( old != null) {
throw new Exception("Already exists!");
}
}
注意:在此代码中,无论如何都会输入新值,即使密钥已经存在,也不能添加null,因为它会引发异常。
答案 2 :(得分:0)
在尝试使用地图中存在的键添加新值时,Map不会抛出任何错误或异常。在这种情况下,旧值只是被新值替换。
如果要添加在这种情况下会引发错误的功能,可以使用
if(map.containsKey(yourKey)) // here your error action
答案 3 :(得分:0)
在放置操作之前使用包含检查不是原子操作,因此不是线程安全的。此外,每次添加条目时,都必须两次访问该地图。
为避免这种情况,请使用诸如合并或计算之类的功能方法之一
map.merge(key, value, (v1, v2) -> {
throw new IllegalArgumentException("Duplicate key '" + key + "'.");
});