在链表中使用递归时索引超出范围的异常

时间:2014-10-29 21:36:57

标签: java recursion linked-list

因此,在大多数情况下,我需要使用递归方法计算链接列表中的元素数量。但是,我被抛出一个超出范围的例外。我似乎无法解决这个问题。

import java.util.*;
import java.util.LinkedList;

public class ListCount {
public static LinkedList<String> ll = new LinkedList<String>();

public static void main(String[] args) {
    int size = 0;
LinkedList<String> list = new LinkedList<String>();
list.add("Hi");
list.add("I");
list.add("am");
list.add("a");
list.add("programmer");
list.add("and");
list.add("I");
list.add("am");
list.add("currently");
list.add("working");
list.add("on");
list.add("an");
list.add("assignment");
list.add("that");
list.add("is");
list.add("based");
list.add("on");
list.add("linkedlists");
list.add("for");
list.add("java");

ll = list;

countsize(size);


}
    public static int countsize(int somevalue)
    {
   Iterator next = ll.listIterator(somevalue);  
    {
        if (next == null)
    {
      return 0; 
    }
    else 
    {
    countsize(somevalue + 1);
    }
   System.out.println(somevalue);
    }
  return 0;
}    

这是stacktrace:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 21, Size: 20
    at java.util.LinkedList.checkPositionIndex(Unknown Source)
    at java.util.LinkedList.listIterator(Unknown Source)
    at ListCount.countsize(ListCount.java:44)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.countsize(ListCount.java:52)
    at ListCount.main(ListCount.java:38)

6 个答案:

答案 0 :(得分:0)

next永远不会为空,因为listIterator将始终返回Iterator。你需要检查的是Iterator本身是否有下一个元素。所以改变:

if(next == null)

if (!next.hasNext())

答案 1 :(得分:0)

问题在于你需要使用interator next(将其重命名为listItr或其他东西以避免混淆)来获取下一个元素(如果有的话)。请看下面的例子:

  // Set Iterator at specified index
  Iterator x = list.listIterator(1);

  // Get the next element with the iterator
  if (x.hasNext()) {
     System.out.println(x.next());
  }

使用此代码,您也可以避免使用NoSuchElementException

答案 2 :(得分:0)

你需要迭代。 替换if(不是== null)By if(next.next()== null)

答案 3 :(得分:0)

有两个问题:

  1. 终止时需要检查next.hasNext()
  2. 您需要修复递归:目前您的methid将始终返回0,因为您忽略了递归返回值
  3. 试试这个:

    public static int countsize(int somevalue) {
        Iterator next = ll.listIterator(somevalue);  
        if (!next.hasNext())
            return someValue; 
        System.out.println(somevalue);
        return countsize(somevalue + 1);
    }
    

答案 4 :(得分:0)

基本问题是你的#countsize(int)方法无限制地重复出现,直到它尝试实例化一个具有超出列表范围的起始索引的迭代器。 “(next == null)”谓词永远不会通过,因为List.listIterator(int)永远不会返回null。

就像使用相同的索引调用LinkedList.get(int)一样 - 您要么获取该索引处的值(或者从#listIterator(int)方法的索引处开始的Iterator),要么抛出IndexOutOfBoundsException(如果索引)你给的是大于列表中的最高值。

对你的任务的限制作出一些假设,我猜你需要使用迭代器(而不仅仅是使用#get(int))。如果是这种情况,您可能只需在main方法中使用#iterator(void)实例化单个迭代器,并将其传递给count方法。该方法应该在调用#next()并重复之前递归检查#hasNext()方法。

否则你可以在catch块中处理IndexOutOfBoundsException吗?

答案 5 :(得分:-1)

你错误地指出了几点:

  • 你的列表构造过于冗长
  • 您的测试next == null应为next.hasNext(),但我将其重命名为it
  • 无论发生什么,你总是返回0,从不使用递归调用的结果

这是一个有效的解决方案:

public class ListCount {
    public static LinkedList<String>    ll  = new LinkedList<String>();

    public static void main(String[] args) {
        String s = "Hi I am a programmer and I am currently working on an assignment that is based on " +
                "linkedlists for java";
        ll = new LinkedList<String>(Arrays.asList(s.split("\\s+")));
        System.out.println(countsize(0));
        System.out.println(ll.size());
    }

    public static int countsize(int somevalue) {
        Iterator<String> it = ll.listIterator(somevalue);
        return it.hasNext() ? countsize(somevalue + 1) + 1 : 0;
    }
}