如何在不覆盖先前条目的情况下将()ArrayList添加到2D ArrayList?

时间:2014-08-21 00:38:00

标签: java android arrays 2d overwrite

好的,所以我知道为什么会这样: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,这使我找到的解决方案不适用。

2 个答案:

答案 0 :(得分:2)

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

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

因此您可以通过了解它们的关键字轻松找到该值。在这个数据结构中你不浪费内存,但是如果curid是2,你的例子的arraylist,下一个是10,你必须在3,4,5,6,7,8的所有arraylist索引中放入null, 9。这让你跟踪它们并引用它们很困难。(我假设这个,因为我认为你想要调用类似cv [curId] [0]的东西,你必须确保在index [curId]你有一个值而且它不是null,这使得创建错误的可能性非常大)所以让我们尝试通过这个新问题来解决你的问题:

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

答案 1 :(得分:0)

为什么不将所有“Helper stuff”移动到辅助方法中?

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);
}