【问题标题】:How do I add() ArrayList to a 2D ArrayList without overwriting prior entries?如何在不覆盖先前条目的情况下将() ArrayList 添加到 2D ArrayList?
【发布时间】:2014-10-14 12:17:12
【问题描述】:

好的,我知道为什么会这样了:cv.add(curid, temp);正在添加对 temp 的引用,temp 的内容稍后会更改,导致所有条目都相同,因为它们都链接到 temp。我查找了解决方案,但找不到适合我情况的解决方案,请参见下文:

         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
         factory.setNamespaceAware(false);
         Context context = getApplicationContext();
         Resources res = context.getResources();
         XmlResourceParser xpp = res.getXml(R.xml.thedata);
         ArrayList<ArrayList<String>> cv = new ArrayList<ArrayList<String>>();

         //Helper stuff
         int curid = 0;
         ArrayList<String> temp = new ArrayList<String>();

         int eventType = xpp.getEventType();
         while (eventType != XmlPullParser.END_DOCUMENT) {
             if (eventType == XmlPullParser.START_TAG) {
                 if(xpp.getName().equalsIgnoreCase("id")){
                     curid = Integer.parseInt(xpp.nextText());
                 } 
                 if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
                     temp.add(xpp.getName() + "<>" + xpp.nextText());
                 }

             } 
             else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
                 cv.add(curid, temp);
                 temp.clear();
             }
             eventType = xpp.next(); //move to next element
             //Restart Loop
         }

我需要先在循环中填充 ArrayList temp,这使得我发现的解决方案不适用。

【问题讨论】:

    标签: java android arrays 2d overwrite


    【解决方案1】:

    为什么不将所有“Helper 的东西”移到一个 helper 方法中?

    public ArrayList<String> helperMethod(XmlResourceParser xpp, MutableInt id) {
         int curid = 0;
         ArrayList<String> temp = new ArrayList<String>();
    
         int eventType = xpp.getEventType();
         while (eventType != XmlPullParser.END_DOCUMENT) {
             if (eventType == XmlPullParser.START_TAG) {
                 if(xpp.getName().equalsIgnoreCase("id")){
                     curid = Integer.parseInt(xpp.nextText());
                 } 
                 if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
                     temp.add(xpp.getName() + "<>" + xpp.nextText());
                 }
    
             } 
             else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
                 id.setValue(curid);
                 break;
             }
             eventType = xpp.next(); //move to next element
             //Restart Loop
         }
         return temp;
    }
    

    那么你可以这样称呼它

    ArrayList<String> tempList;
    MutableInt id = new MutableInt(0);
    while((tempList = helperMethod(xpp, id)) != null) {
        cv.add(id, tempList);
    }
    

    【讨论】:

      【解决方案2】:

      我认为你应该使用MapMap 是一个包含键和值的数据结构,第一个元素是键,第二个是值:

       Map<key,value> myMap = new HashMap<key,value>();
      

      因此您只需知道它们的键即可轻松找到值。在此数据结构中,您不会浪费内存,但在示例的 arraylist 中,如果 curid 为 2,下一个为 10,则必须在 3、4、5、6、7、8 的所有 arraylist 索引中放入 null, 9.这使您难以跟踪它们并引用它们。(我假设这是因为我认为您希望例如调用诸如 cv[curId][0] 之类的东西,并且您必须确保在索引 [curId] 处您有一个值并且它不为空,这很可能会产生错误)所以让我们尝试通过这个新问题来解决您的问题:

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
               factory.setNamespaceAware(false);
               Context context = getApplicationContext();
               Resources res = context.getResources();
               XmlResourceParser xpp = res.getXml(R.xml.thedata);
               Map<int,ArrayList<string>> cv = new HashMap<int,ArrayList<string>>();
      
               //Helper stuff
               int curid = 0;
               ArrayList<String> temp = new ArrayList<String>();
      
               int eventType = xpp.getEventType();
               while (eventType != XmlPullParser.END_DOCUMENT) {
                   if (eventType == XmlPullParser.START_TAG) {
                       if(xpp.getName().equalsIgnoreCase("id")){
                           curid = Integer.parseInt(xpp.nextText());
                       } 
                       if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
                           temp.add(xpp.getName() + "<>" + xpp.nextText());
                       }
      
                   } 
                   else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
                       cv.put(curid,temp);
                       temp = new ArrayList<String>();
                   }
                   eventType = xpp.next(); //move to next element
                   //Restart Loop
               }
      

      现在例如你想访问 curId = 10 的 ArrayList

      ArrayList<String> element = (ArrayList<String>) cv.get(10);
      

      更多示例请看:

      http://tutorials.jenkov.com/java-collections/map.html

      【讨论】:

        猜你喜欢
        • 2015-08-10
        • 2019-08-15
        • 2020-03-02
        • 2017-01-11
        • 1970-01-01
        • 2017-02-28
        • 2020-11-08
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多