3 回答

TA贡献1780条经验 获得超5个赞
改变
return output;
到
return output + current;
您没有将最后一个元素附加到您的输出中。
此外,您Iterator::next
在检查之前调用Iterator::hasNext
,如果您有一个空的Bag
,则会有一个NoSuchElementException
.

TA贡献1891条经验 获得超3个赞
在其他答案中已经批评了迭代器的使用;还应注意边界条件:0 或 1 个儿童。
public String toString() {
String output = String.format("a %s", name);
if (!children.isEmpty()) {
// Unfortunately because of the recursion the following
// cannot be done.
//String list = children.stream()
// .map(Entity::toString).collect(Collectors.join(", "));
//output += list.replaceFirst(", ([^,]*)$", " and $1");
// Iterating from the back reversed, allows an easy
// discrimination of comma and "and."
StringBuilder list = new StringBuilder();
String separator = " and ";
ListIterator<Entity> itemIterator = children.listIterator(children.size());
while (itemIterator.hasPrevious()) {
Entity entity = itemIterator.previous();
list.insert(0, entity.toString());
if (itemIterator.hasPrevious()) {
list.insert(0, separator);
separator = ", ";
}
}
output += list.toString();
}
return output;
}

TA贡献1906条经验 获得超3个赞
你在 while 条件下有错误
if (!itemIterator.hasNext()) return output;
Entity current = itemIterator.next();
while (true) {
output += current.toString();
if (!itemIterator.hasNext()) break;
Entity next = itemIterator.next();
// ......
current = next;
}
return output;
你基本上跳过最后一个实体
添加回答
举报