Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最后输入的HashMap键是映射中每个元素的设置_Java_Android_Xml_Hashmap - Fatal编程技术网

Java 最后输入的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

我正在使用XMLPullParser将XML解析为hashmap。我的XML是一个“菜单”,hashmap的键是类别,值是菜单项的ArrayList。但是,在HashMap中,输入的最后一个键是HashMap中所有项的键,而不仅仅是最后一个元素。为什么会这样?这是我的密码:

   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 &amp; 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