我理解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());
}
}
答案 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);
}
}