【问题标题】:ArrayList of ArrayList returning incorrect data [duplicate]ArrayList的ArrayList返回不正确的数据[重复]
【发布时间】:2015-10-31 11:17:50
【问题描述】:

我目前正在制作一个 android 应用程序,它需要将一些数据量临时保存为数组列表(字符串)的数组列表,但是当我试图绕过它们时,添加虚拟数据并将其打印到depug 流,我没有得到我期望的数据,但最后添加了三行数据。如果这确实有意义,这里就是代码。

        ArrayList<ArrayList<String>> module_list = new ArrayList<ArrayList<String>>();
    ArrayList<String> new_row = new ArrayList<String>();

    new_row.add(module_description,"Description0");
    new_row.add(module_address, "Address0");
    new_row.add(module_type, "Type0");
    module_list.add(0,new_row);

    new_row.add(module_description, "Description1");
    new_row.add(module_address,"Address1");
    new_row.add(module_type, "Type1");
    module_list.add(1,new_row);

    new_row.add(module_description, "Description2");
    new_row.add(module_address, "Address2");
    new_row.add(module_type,"Type2");;
    module_list.add(2, new_row);


    for(int row = 0; row<module_list.size() ; row++) {
        ArrayList<String> returned_row = new ArrayList<String>();
        returned_row = module_list.get(row);

        Log.d("APP", "Row: "+ Integer.toString(row));
        Log.d("APP", "Module description: " + returned_row.get(module_description));
        Log.d("APP", "Module address: " + returned_row.get(module_address));
        Log.d("APP", "Module type: " + returned_row.get(module_type));
    }

本来打算依次打印arraylist每一行的内容,结果却得到:

Row: 0
Module description: Description2
Module address: Address2
Module type: Type2
Row: 1
Module description: Description2
Module address: Address2
Module type: Type2
Row: 2
Module description: Description2
Module address: Address2
Module type: Type2

这是添加的最后一行,但代替了所有行。以前有人遇到过这样的问题吗?任何建议将不胜感激。

【问题讨论】:

    标签: java android multidimensional-array arraylist


    【解决方案1】:

    您必须在每次添加到 module_list

    之前初始化 new_row
    ArrayList<ArrayList<String>> module_list = new ArrayList<ArrayList<String>>();
            ArrayList<String> new_row = new ArrayList<String>();
    
            new_row.add(module_description,"Description0");
            new_row.add(module_address, "Address0");
            new_row.add(module_type, "Type0");
            module_list.add(0,new_row);
    
            new_row = new ArrayList<String>();
            new_row.add(module_description, "Description1");
            new_row.add(module_address,"Address1");
            new_row.add(module_type, "Type1");
            module_list.add(1,new_row);
    
            new_row = new ArrayList<String>();
            new_row.add(module_description, "Description2");
            new_row.add(module_address, "Address2");
            new_row.add(module_type,"Type2");;
            module_list.add(2, new_row);
    
    
            for(int row = 0; row<module_list.size() ; row++) {
                ArrayList<String> returned_row = new ArrayList<String>();
                returned_row = module_list.get(row);
    
                Log.d("APP", "Row: "+ Integer.toString(row));
                Log.d("APP", "Module description: " + returned_row.get(module_description));
                Log.d("APP", "Module address: " + returned_row.get(module_address));
                Log.d("APP", "Module type: " + returned_row.get(module_type));
            }
    

    如果你不初始化它,那么它将覆盖现有键的值。

    【讨论】:

    • 不客气。
    • 而不是 new_row = new ArrayList();你可以使用 new_row.clear();
    【解决方案2】:

    试试这个:

    HashMap<Integer, ArrayList<String>> module_list =      new HashMap<Integer, ArrayList<String>>();
    ArrayList<String> new_row = new ArrayList<String>();
    
    new_row.add(module_description,"Description0");
    new_row.add(module_address, "Address0");
    new_row.add(module_type, "Type0");
    module_list.put(0,new_row);
    
    new_row.add(module_description, "Description1");
    new_row.add(module_address,"Address1");
    new_row.add(module_type, "Type1");
    module_list.put(1,new_row);
    
    new_row.add(module_description, "Description2");
    new_row.add(module_address, "Address2");
    new_row.add(module_type,"Type2");;
    module_list.put(2, new_row);
    

    【讨论】:

    • 没用,我也尝试了 hashmaps 的 hashmap,但结果相同。不过还是谢谢你的建议!
    【解决方案3】:

    而不是使用: module_list.add(0,new_row); 你可以检查使用 module_list.add(new_row); 由于 Arraylist 是有序集合,所以不需要给出索引。

    【讨论】:

    • 不,没用 :( 不过谢谢!
    猜你喜欢
    • 2021-02-16
    • 2014-07-19
    • 1970-01-01
    • 2012-05-27
    • 2014-11-01
    • 2021-04-29
    • 1970-01-01
    • 2013-12-17
    • 2017-01-31
    相关资源
    最近更新 更多