【问题标题】:2D ArrayList Index Out of Bounds2D ArrayList 索引超出范围
【发布时间】:2017-07-30 01:06:13
【问题描述】:

我正在为我的 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 数组列表的新功能。
这是我的代码。

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

【问题讨论】:

  • 你需要使用String.valueOf(mStrings.get(y))
  • 试试我的答案....

标签: java android multidimensional-array indexoutofboundsexception


【解决方案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'th 元素,此时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)));
    }
}

【讨论】:

    【解决方案2】:

    由于你使用的是二维数组列表,所以在实现部分,你需要做的是

    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. 
    

    【讨论】:

      【解决方案3】:

      您正在使用list ArrayList 迭代mString 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)));
          }
      
      }
      

      【讨论】:

        【解决方案4】:

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

        list 只有1 元素意味着list.get(0)for(int y=0;y&lt;mStrings.size();y++){ 将被执行4 次,因此此处出现错误list.get(y)

        list 仅包含单个元素,即mStrings

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

        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( 是不必要的,因为您的数据是字符串类型

        【讨论】:

        • 注意:Log 方法抛出异常并显示空消息,因此String.valueOf 有助于解决此问题
        【解决方案5】:

        你需要索引吗?

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

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

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

        【讨论】:

        • 是的,我需要索引。因为我在不同的索引中输入了一些值。
        • 好的,那么其他答案提供了该解决方案
        【解决方案6】:

        绘制ListList 的假设图片可能会有所帮助。这是一个可能的外部列表及其内容:

        0: []
        1: [a, b, c]
        2: [d, e]
        3: []
        

        等等

        因此,它与二维数组的不同之处在于没有统一的列大小。

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

        鉴于此,要遍历 List&lt;List&lt;Object&gt;&gt;,您每次都必须检查内部列表的大小以及

        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) 在子列表中返回一个值。

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

        【讨论】:

          猜你喜欢
          • 2021-12-10
          • 2019-03-25
          • 2020-02-13
          • 1970-01-01
          • 1970-01-01
          • 2014-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多