【问题标题】:While loop, IndexOutOfBoundsException: Index: 1, Size: 1While 循环,IndexOutOfBoundsException:索引:1,大小:1
【发布时间】:2019-02-01 07:58:32
【问题描述】:

完整代码:

  public static String[] dirReduc(String[] arr) {


    LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));


    for (int t = 0; t < list.size(); t++) {
        for (int q = t + 1; q < list.size() ; q++) {


        while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                list.get(t).contains("EAST") && list.get(q).contains("WEST"))



            for (int i = 0; i < list.size(); i++) {
                for (int k = i + 1; k < list.size(); k++) {

                    if (list.get(i).contains("NORTH") && list.get(k).contains("SOUTH") ||
                        list.get(i).contains("SOUTH") && list.get(k).contains("NORTH") ||
                        list.get(i).contains("WEST") && list.get(k).contains("EAST") ||
                        list.get(i).contains("EAST") && list.get(k).contains("WEST")) {
                        list.remove(i);
                        list.remove(k - 1);
                    }
                }
                }
            }
        System.out.println(list);
    }
    return null;
}

删除循环可以正常工作。

我关于while循环的问题:

在此字段的while循环中:

 list.get(t).contains("WEST") && list.get(q).contains("EAST") ||

我得到:IndexOutOfBoundsException:索引:1,大小:1

List 中只剩下一个元素。

据我所知:索引 q 检查列表中最后一个元素之后的元素并获取 OutOfBound。

我该如何解决这个问题?

在类似的主题中,我找不到明确的答案,对于我的问题,请帮助。

【问题讨论】:

标签: java loops while-loop indexoutofboundsexception


【解决方案1】:

为什么不在像这样进入while循环之前检查列表是否包含一个,因为正是这种情况导致了错误。

  if(list.size() == 1)
     q=t

在你的代码中是这样的:

for (int t = 0; t < list.size(); t++) {
        for (int q = t + 1; q < list.size() ; q++) {
          if(list.size() == 1)
             q=t;
        while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                list.get(t).contains("EAST") && list.get(q).contains("WEST"))

如果列表只包含一个元素,则避免使用 while 循环。

【讨论】:

    【解决方案2】:

    不应该在循环之前检查,而是循环自己。

    Aftel while 循环检查中断循环的条件。

    像这样工作:

        LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));
    
    
        for (int t = 0; t < list.size(); t++) {
            for (int q = t + 1; q < list.size(); q++) {
                    while (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH")
                           || list.get(t).contains("SOUTH") && list.get(q).contains("NORTH")
                           || list.get(t).contains("WEST") && list.get(q).contains("EAST")
                           || list.get(t).contains("EAST") && list.get(q).contains("WEST"))
    
                        if (q < list.size()) q = t;
    
    
                    for (int i = 0; i < list.size(); i++) {
                        for (int k = i + 1; k < list.size(); k++) {
    
                            if (list.get(i).contains("NORTH") && list.get(k).contains("SOUTH")
                                    || list.get(i).contains("SOUTH") && list.get(k).contains("NORTH")
                                    || list.get(i).contains("WEST") && list.get(k).contains("EAST")
                                    || list.get(i).contains("EAST") && list.get(k).contains("WEST")) {
                                list.remove(i);
                                list.remove(k - 1);
                            }
                        }
                    }
                }
            System.out.println(list);
            }
        return null;
    }
    

    感谢所有回复的人。

    【讨论】:

      【解决方案3】:

      这应该可以解决问题。

      在列表中使用之前需要检查索引:

      while (t < list.size() && q < list.size() &&  (list.get(t).contains("NORTH") && list.get(q).contains("SOUTH") ||
                      list.get(t).contains("SOUTH") && list.get(q).contains("NORTH") ||
                      list.get(t).contains("WEST") && list.get(q).contains("EAST") ||
                      list.get(t).contains("EAST") && list.get(q).contains("WEST")))
      

      【讨论】:

        【解决方案4】:

        您有 q 等于 (t + 1),这已经超出范围,因此您必须检查 q 是否小于或等于列表大小才能运行 while 循环以继续程序。

        if (q <= list.size()) {
            // Your while loop
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          • 2018-02-13
          • 2016-10-09
          • 2020-10-27
          • 2015-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多