重复插入时映射抛出错误

时间:2017-11-13 11:44:32

标签: java dictionary

我正在创建一个存储一些数据的Map,如果尝试插入重复值,我希望地图抛出异常。

Map <Integer, String> temp;
temp.put(1, "hi");
temp.put(1, "hello");

此处此映射应抛出错误,因为密钥“1”已存在。 它可能会抛出错误或无法编译。 是否有任何具有所述功能的地图?

4 个答案:

答案 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 + "'.");
});