需要帮助了解如何找到迭代的getLength()



我很难理解为什么在作业中找不到可迭代对象的getLength((。该类应该是一个";工具箱";提供了一些有用的方法来处理迭代程序和迭代器。

/** Computes the length of an Iterable.
The length of an Iterable is the total number of entries it returns.
public static <T> int getLength(Iterable<T> iterable)
{
int numEntries = 0;
while(iterable.hasNext()) {
numEntries++;
iterable.next();
}
return numEntries;
}

这是我目前拥有的,但我正在获得这个

Toolkit.java:30: error: cannot find symbol
while(iterable.hasNext()) {
^
symbol:   method hasNext()
location: variable iterable of type Iterable<T>
where T is a type-variable:
T extends Object declared in method <T>getLength(Iterable<T>)

这在概念上是行不通的。Iterable的概念是唯一,您可以要求它生成迭代器。是迭代器完成了整个hasNextnext的工作。每次你请求迭代器时,迭代器都不能保证返回相同的迭代器;您可以调用iterator()并查看500个项目,然后再次调用它并查看512。您没有特别的保证,因此,"请求可迭代的长度">是不可回答的。对于一些特定的已知迭代,例如ArrayList,您可以回答这个问题,而且这样做很容易,但有些迭代无法做到这一点。各种可迭代项只能被要求iterator()一次,例如,任何代表流概念的内容(假设您的可迭代项是发送到电报频道的所有电报消息的消防水管(。

换句话说,这是愚蠢的家庭作业;无论是谁,都不完全理解这些概念所代表的含义。这段代码将适用于一些可迭代项,但对于许多其他可迭代项则会失败,要么在调用后使其迭代能力失效,要么崩溃,要么给出错误的答案——这正是您所写的,只是先制作一个迭代器。当我们在做的时候,让我们在这里去掉无用的<T>,我们不需要它:

public static int getLength(Iterable<?> iterable) {
int numEntries = 0;
var iterator = iterable.iterator();
while(iterator.hasNext()) {
numEntries++;
iterator.next();
}
return numEntries;
}

然而,考虑到这实际上并不"有效",我会写一些完全不同的东西:

public static int getLength(Iterable<?> iterable) throws IllegalArgumentException {
if (iterable instanceof Collection<?>) return ((Collection<?>) iterable).size();
throw new IllegalArgumentException("I don't know how to obtain the size for an iterable of type " + iterable.getClass());
}

实际上,整个设置中的错误就是参数。它应该一直是Collection<?>。你遇到的几乎所有可迭代对象都实现了Collection-Iterable和Collection之间的主要区别在于,你可以问一个集合有多大。Iterable特别存在于,因为它代表了一种类型,其中"我能知道你有多大吗"是而不是所需的能力。进一步强调这个家庭作业是多么愚蠢。

请随意指导你的老师回答这个问题。如果这是一本普通教程或书,把它扔掉,再拿一本。

试试这个:

public static int size(`Iterable` data) {
if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
int counter = 0;
for (Object i : data) {
counter++;
}
return counter;
}

最新更新