2D ArrayList索引超出界限

时间:2017-03-09 06:58:18

标签: java android multidimensional-array indexoutofboundsexception

我正在为我的APP实施2D数组 但不幸的是我有这个错误。

FATAL EXCEPTION: main
   Process: com.application.recast, PID: 18534
   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.application.recast/com.application.recast.SplashScreen}: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
       at android.app.ActivityThread.-wrap12(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6077)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
       at java.util.ArrayList.get(ArrayList.java:411)
       at com.application.recast.SplashScreen.onCreate(SplashScreen.java:60)
       at android.app.Activity.performCreate(Activity.java:6664)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
       at android.app.ActivityThread.-wrap12(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:154) 
       at android.app.ActivityThread.main(ActivityThread.java:6077) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我正在做的是,我想将特定项目存储到2D数组的特定索引中 相当新的2D arraylist。
这是我的代码。

ArrayList<String> mStrings = new ArrayList<>();
ArrayList<ArrayList<String>> list = new ArrayList<>();

mStrings.add("HI");
mStrings.add("HI2");
mStrings.add("HI3");
mStrings.add("HI4");
list.add(0,mStrings);

for(int x=0;x<list.size();x++){
    for(int y=0;y<mStrings.size();y++){
        Log.d("VALUE",String.valueOf(list.get(y)));
    }
}

6 个答案:

答案 0 :(得分:3)

问题 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at

list只有1元素平均值list.get(0),但for(int y=0;y<mStrings.size();y++){将执行4次,因此错误list.get(y)

list仅包含单个元素,即mStrings

以及list中的单个元素的进一步此逻辑有效,但对于list中的多个元素,您需要从list获取元素然后遍历它< / p>

for(int x=0;x<list.size();x++){
         ArrayList<String> sublist = list.get(x);
            for(int y=0;y<sublist.size();y++){
                //Log.d("VALUE",String.valueOf(sublist.get(y)));
                Log.d("VALUE at index "+y,sublist.get(y));
            }
        }

注意:现在String.valueOf(是不必要的,因为您的数据是字符串类型

答案 1 :(得分:1)

可能有助于绘制List List 0: [] 1: [a, b, c] 2: [d, e] 3: [] 的假设图片。这是一个可能的外部列表及其内容:

List<List<Object>>

因此,它与2D数组不同,因为没有统一的列大小。

所以你可以看到,索引0的外部列表是空的,索引1,有一个包含3个项目的列表,等等。

鉴于此,要迭代for (int x = 0; x < list.size(); x++) { for (int y = 0; y < list.get(x).size(); y++) { Log.d("VALUE", String.valueOf(list.get(x).get(y))); } } ,您每次时都必须检查内部列表的大小

list.get(x)

list.get(x).get(y)本身返回一个列表,class B { } class D : public B { } int main() { B* b = new B; D* d = new D; b = static_cast<B*> d; // Valid d = static_cast<D*> b; // Valid b = d; // Valid. Implicit casting. } 返回子列表中的值。

更新:或者@ cricket_007指出,您可以使用 for-each 样式循环,以获得更易读的代码。

答案 2 :(得分:1)

您正在使用mString ArrayList

重复list ArrayList尺寸

<强>条件

  

如果mString ArrayList尺寸大于list ArrayList   然后会有IndexOutOfBoundsException

试试这个

for(int x=0;x<list.size();x++){
Log.d("VALUE",String.valueOf(list.get(x)));
    for(int y=0;y<mStrings.size();y++){
        Log.d("VALUE2",String.valueOf(mStrings.get(x)));
    }

}

答案 3 :(得分:1)

你需要索引吗?

如果没有,您可以使用增强的for循环。

for(List<String> innerList : mStrings){
    for(String s : innerList){
        Log.d("VALUE", s);
    }
}

您的错误是list.size() != mStrings.size()

答案 4 :(得分:1)

由于您正在使用2D数组列表,因此在实现部分中,您需要做的是

ArrayList<T> A = new ArrayList();
ArrayList<ArrayList<T>> B = new ArrayList();

这意味着Arraylist B在每个索引中存储Arraylist A. 所以要将存储的元素放在B中。你需要这样做。

ArrayList<T> A = B.get(i); // this will return the list stored at index i or you can say ith row.

//now
T a = A.get(j); //this will return the item stored index jth.

//in one line
T a = (B.get(i)).get(j); // this will return the value stored at ith row and jth column. 

答案 5 :(得分:1)

这是你的代码

ArrayList<String> mStrings = new ArrayList<>();
ArrayList<ArrayList<String>> list = new ArrayList<>();

mStrings.add("HI");
mStrings.add("HI2");
mStrings.add("HI3");
mStrings.add("HI4");
list.add(0,mStrings);

for(int x=0;x<list.size();x++){
    for(int y=0;y<mStrings.size();y++){
        Log.d("VALUE",String.valueOf(list.get(y)));
    }
}

list只有一个元素,但是当y由于y的大小而变得更大时,你会尝试达到mStrings'元素。您需要list.get(x).get(y)而不是list.get(y)。最好动态定义内部for,以便在外部列表包含更多元素时应对这种情况:

ArrayList<String> mStrings = new ArrayList<>();
ArrayList<ArrayList<String>> list = new ArrayList<>();

mStrings.add("HI");
mStrings.add("HI2");
mStrings.add("HI3");
mStrings.add("HI4");
list.add(0,mStrings);

for(int x=0;x<list.size();x++){
    for(int y=0;y<list.get(x).size();y++){
        Log.d("VALUE",String.valueOf(list.get(x).get(y)));
    }
}