我编写了一个XML解析器,它解析XML文档并返回Map和ID以及Name。出于某种原因,它正在跳过重复的ID。
编辑:
public static Multimap<String,String> getMap(String pathToFile) {
Multimap<String,String> map = new ArrayListMultimap.create();
try {
Document doc = getDocument(pathToFile);
NodeList nList = doc.getElementsByTagName("Definition");
for(int i=0;i<nList.getLength();i++) {
Node nNode = nList.item(i);
if(nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String nodeID = eElement.getElementsByTagName("Key").item(0).getTextContent();
NodeList n = eElement.getElementsByTagName("Value");
for(int j=0;j<n.getLength();j++) {
String name = n.item(0).getTextContent();
if(name.equalsIgnoreCase("")) {
name = "blank"; // check for empty values
}
map.put(nodeID, name);
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
return map;
}
public static List<String> getIDList(String pathToFile) {
List<String> list = new ArrayList<String>();
Multimap<String, String> map = getMap(pathToFile);
for(String id : map.keySet()) {
list.add(id);
}
return list;
}
我的问题是,为什么会发生这种情况?为什么重复被忽略?
答案 0 :(得分:0)
因为,它是一个地图:关键是唯一的:在地图中,如果你放(ID,“AA”);并放(ID,“BB”);只有ID-“BB”仍然存在。这是理念:地图将键映射到唯一值。
所以不要使用地图。
您可以在Set,Vector或List中使用某些对,如下所示:
组&LT;对&lt;字符串,字符串&gt;&gt;或列表&lt;对&gt;,向量&lt;对&LT;字符串,字符串&GT;&GT;
或者你可以使用MultiMap(带有键和多个值的地图):
How to create a Multimap<K,V> from a Map<K, Collection<V>>?
Multimap示例:
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
Multimap<String,String> mm=ArrayListMultimap.create(); //
mm.put("AAA", "123");
mm.put("AAA", "444");
mm.put("AAA", "555");
mm.put("BBB", "777");
// to use keySet
mm.keySet();
// getting values
Collection<String> values=mm.get("AAA");
for (String a_value: values) System.out.println("VALUE:"+a_value);
如果你想使用Pair,你必须重新创建get,keySet,...
Pair the_pair=new Pair(ID,Name);
礼貌:A Java collection of value pairs? (tuples?)
public class Pair<L,R> implements java.io.Serializable {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() { return left; }
public R getRight() { return right; }
@Override
public int hashCode() { return left.hashCode() ^ right.hashCode(); }
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (!(o instanceof Pair)) return false;
Pair pairo = (Pair) o;
return this.left.equals(pairo.getLeft()) &&
this.right.equals(pairo.getRight());
}
}