2014-10-29 84 views
0

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

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

这里是堆栈跟踪:

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) 
+0

无论是“要求”你通过递归计算列表中元素的数量,都要求一些非常荒谬的东西。如果列表中有足够的元素,无论编写代码的方式如何,您都会遇到堆栈溢出错误。更好的方法是使用while循环对元素进行计数,或者只需在列表本身调用size()函数。 – 2014-10-29 21:58:47

回答

0

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

if(next == null) 

if (!next.hasNext()) 
+0

这既不......如果你不将迭代器移动到下一个元素,它将永远循环。 – Domin 2014-10-29 21:47:14

+0

啊,这么简单的错误!完美的工作,谢谢! – 2014-10-29 21:47:19

+0

@Domin你不需要移动它,你只是想检查它是否有下一个元素... – user2336315 2014-10-29 21:47:39

0

这是问题所在,你需要使用迭代符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太。

0

你需要interate。 更换,如果(下一个== NULL)通过IF(next.next()== NULL)

+0

如果迭代器没有下一个元素(并且会抛出NoSuchElementException),这将不起作用。 – user2336315 2014-10-29 21:44:27

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

有两个问题:

  1. 终止
  2. 时,您需要检查next.hasNext()你需要修复的递归:目前你methid总是返回0因为你忽略了递归返回值

试试这个:

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

基本问题是,您的#countsize(int)方法无限制地重复出现,直到它尝试实例化具有您的列表范围之外的起始索引的Iterator。 “(next == null)”谓词将永远不会传递,因为List.listIterator(int)永远不会返回null。

这就像使用相同索引调用LinkedList.get(int) - 您可以获取该索引处的值(或者从该索引处为#listIterator(int)方法开始的Iterator),也可以抛出IndexOutOfBoundsException你给出的指数大于列表中的最高值。

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

否则,你可以只处理一个catch-block中的IndexOutOfBoundsException?