HashMap重复值 - 标识重复项

时间:2014-11-25 13:38:30

标签: java hashmap duplicates

我理解HashMap不允许插入重复值,并用最新的条目替换最后一个重复值。 有没有办法打印在put方法中找到的重复项?

我有以下代码段:

for( int i = 0; i <= elements.length - 1; i++) {
    nodeDBList = (NodeList) xPath.compile(elements[i]).evaluate(dbDocument, XPathConstants.NODESET);
    for (int j = 0; j < nodeDBList.getLength(); j++) {
        if(nodeDBList.item(j).getFirstChild() != null)
            dbList.put(nodeDBList.item(j).getFirstChild().getNodeValue().toLowerCase().trim(), 
                       nodeDBList.item(j).getNodeName().toLowerCase().trim());

    }
} 

4 个答案:

答案 0 :(得分:4)

错误。 HashMap不支持哈希重复键。

对于不同的键,重复值是完全可以接受的。

您可以通过values()方法并使用equals方法对其进行迭代来搜索现有值。

修改

这里的键和值之间似乎存在混淆。

根据HashMap Map的{​​{1}}实施方式,方法public V put(K key, V value);将返回给定密钥的原始值(如果有)或{ {1}}。

来自API

的报价
  

@return与key关联的上一个值,如果有则返回null   没有密钥的映射。 (null返回也可以指示地图   以前使用密钥关联null。)

答案 1 :(得分:3)

嗯,答案可以在the API description of HashMap中找到:put方法返回之前与密钥关联的值。

  

<强>返回:       与key关联的先前值,如果没有key的映射,则返回null。 (null返回也可以指示地图   以前使用密钥关联null。)

答案 2 :(得分:1)

put方法返回键的旧值,因此您可以输出它。

假设HashMap的值为String的类型:

for( int i = 0; i <= elements.length - 1; i++)
{
    nodeDBList = (NodeList) xPath.compile(elements[i]).evaluate(dbDocument, XPathConstants.NODESET);
    for (int j = 0; j < nodeDBList.getLength(); j++) {
        if(nodeDBList.item(j).getFirstChild() != null) {
            String oldVal = dbList.put(nodeDBList.item(j).getFirstChild().getNodeValue().toLowerCase().trim(), nodeDBList.item(j).getNodeName().toLowerCase().trim());
            if (oldVal != null) {
                System.out.println(oldVal);
            }
        }
    }
} 

答案 3 :(得分:1)

覆盖HashMap

这是一个例子

public class MyMap<K, V> extends HashMap<K,V> {

    private static final long serialVersionUID = -1006394139781809796L;

    @SuppressWarnings({ "unchecked" })
    @Override
    public V put(K key, V value) {
        if (value == null) {
            return super.put(key, value);
        }
        if (value.getClass() == Timestamp.class) {
            DateFormat dateTimeFormatter;
            dateTimeFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, getLocale());
            super.put((K) (key + "_f"), (V) dateTimeFormatter.format(new Date(((Timestamp) value).getTime())));

            DateFormat dateFormatter;
            dateFormatter = DateFormat.getDateInstance(DateFormat.SHORT, getLocale());
            super.put((K) (key + "_f_date"), (V) dateFormatter.format(new Date(((Timestamp) value).getTime())));

        } 
        if (value.getClass() == java.sql.Date.class) {
            DateFormat dateFormatter;
            dateFormatter = DateFormat.getDateInstance(DateFormat.SHORT, getLocale());
            super.put((K) (key + "_f"), (V) dateFormatter.format(new Date(((java.sql.Date) value).getTime())));
        } 
        return super.put(key, value);
    }
}