Java 最后输入的HashMap键是映射中每个元素的设置
我正在使用XMLPullParser将XML解析为hashmap。我的XML是一个“菜单”,hashmap的键是类别,值是菜单项的ArrayList。但是,在HashMap中,输入的最后一个键是HashMap中所有项的键,而不仅仅是最后一个元素。为什么会这样?这是我的密码:Java 最后输入的HashMap键是映射中每个元素的设置,java,android,xml,hashmap,Java,Android,Xml,Hashmap,我正在使用XMLPullParser将XML解析为hashmap。我的XML是一个“菜单”,hashmap的键是类别,值是菜单项的ArrayList。但是,在HashMap中,输入的最后一个键是HashMap中所有项的键,而不仅仅是最后一个元素。为什么会这样?这是我的密码: public HashMap<String, ArrayList<String>> getMenu() throws IOException, XmlPullParserExce
public HashMap<String, ArrayList<String>> getMenu() throws IOException,
XmlPullParserException {
XmlPullParser xpp = appContext.getResources().getXml(R.xml.menu);
HashMap<String, ArrayList<String>> menuItems = new HashMap<String, ArrayList<String>>();
ArrayList<String> items = new ArrayList<String>();
String catName = null;
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
if (xpp.getEventType() == XmlPullParser.START_TAG) {
if (xpp.getName().equals("categoryname")) {
catName = xpp.nextText();
menuItems = new HashMap<String, ArrayList<String>>();
} else if (xpp.getName().equals("item")) {
items.add(xpp.nextText());
}
} else if (xpp.getEventType() == XmlPullParser.END_TAG) {
if (xpp.getName().equals("category")) {
System.out.println("Adding Category: " + catName);
menuItems.put(catName, items);
catName = new String();
}
}
xpp.next();
}
for (Map.Entry<String, ArrayList<String>> entry : menuItems.entrySet()) {
String key = entry.getKey();
ArrayList<String> value = entry.getValue();
for(String str : value) {
System.out.println("Category: " + key + " Item: " + str);
}
}
return menuItems;
}
所以,“鸡肉”是他们所有人的类别,然而,它应该只是最后两个项目的类别。有人知道怎么回事吗?感谢这是因为两件事:每次找到名为
categoryname
的标记时,循环都会为menuitems
创建新对象,并且所有项目都会不断添加到相同的项目
列表中。因此,最后你有一个menuitems
map,它是最后一个找到的类别创建的,它正在添加所有项目,因为它们都添加到同一个列表中。请注意,HashMap
s在任何意义上都没有顺序。我不是说它们有顺序或没有顺序,输入的最后一个键是我所有项目的键,不仅仅是last@MickMnemonic但这不是他的问题。您添加类别的日志在哪里?我怀疑循环中的这一行:menuItems=newhashmap()代码>
<?xml version="1.0" encoding="UTF-8"?>
<restaurant>
<restaurantname>Arbys</restaurantname>
<category>
<categoryname>Roast Beef Sanwiches</categoryname>
<item>Sandwich</item>
<item>Melt</item>
</category>
<category>
<categoryname>Beverages</categoryname>
<item>Brewed Iced Tea</item>
</category>
<category>
<categoryname>Breakfast</categoryname>
<item>Bacon, Egg & Cheese Biscuit</item>
<item>Chicken Biscuit</item>
</category>
<category>
<categoryname>Chicken</categoryname>
<item>Crispy Chicken Sandwich</item>
<item>Prime-Cut Chicken Tenders</item>
</category>
</restaurant>
System.out(7153): Adding Category: Roast Beef Sanwiches
System.out(7153): Adding Category: Beverages
System.out(7153): Adding Category: Breakfast
System.out(7153): Adding Category: Chicken
System.out(6523): Category: Chicken Item: Sandwich
System.out(6523): Category: Chicken Item: Melt
System.out(6523): Category: Chicken Item: Brewed Iced Tea
System.out(6523): Category: Chicken Item: Bacon, Egg & Cheese Biscuit
System.out(6523): Category: Chicken Item: Chicken Biscuit
System.out(6523): Category: Chicken Item: Crispy Chicken Sandwich
System.out(6523): Category: Chicken Item: Prime-Cut Chicken Tenders