因此,在大多数情况下,我需要使用递归方法计算链接列表中的元素数量。但是,我被抛出一个超出范围的例外。我似乎无法解决这个问题。
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)
答案 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)
有两个问题:
next.hasNext()
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);
}
答案 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
这是一个有效的解决方案:
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;
}
}