迭代器 = null 和 hasnext = false 有什么区别?



我正在编写一个代码来压平一个2d列表,比如[[1,2], [3], [4,5,6]]。我希望它们像[1,2,3,4,5,6]一样在一个列表中。当我想检查coliter是否在一行的末尾时,我希望它们更改为下一行。

while ((colIter == null || !colIter.hasNext()) && rowIter.hasNext())

当我这样做的时候,我在想colIter == null!colIter.hasNext()之间有什么区别?

private Iterator<List<Integer>> rowIter;
private Iterator<Integer> colIter;
public Solution_2(List<List<Integer>> vec2d) {
rowIter = vec2d.iterator();
colIter = Collections.emptyIterator();
}
@Override
public Integer next() {
return colIter.next();
}
@Override
public boolean hasNext() {
while ((colIter == null || !colIter.hasNext()) && rowIter.hasNext()) {
colIter = rowIter.next().iterator();
}
return colIter != null && colIter.hasNext();
}
@Override
public void remove() {
while (colIter == null && rowIter.hasNext()) {
colIter = rowIter.next().iterator();
if (colIter != null) {
colIter.remove();
}
}
}

如果您使用嵌套列表。。。

[ [1,2], [3], [4,5,6] ]

你可以用另一种方式来看待它。

0: [1, 2]
1: [3]
2: [4, 5, 6]

也就是说,由于列表的嵌套属性,因此列表具有二维表示形式。第0行包含值1和2,第1行包含3,第2行包含4、5和6。

当你写

colIter == null || !colIter.hasNext()) && rowIter.hasNext()

你要检查的是:

  • 是否存在列
  • 如果存在,
    • 我们是否用完了列迭代以及我们是否有更多的东西要从行中读取

以这种方式考虑嵌套列表:

0: [1, 2]
1: []
2: [3, 4, 5]

对于第1行,肯定是列,但我们没有任何值要处理,还有其他事情要做,所以我们可以跳过这个记录。

如果我们在嵌套列表的末尾,那么我希望调用colIter.next()来抛出NoSuchElementException,而不是返回null。您可能想要对此进行调查。

Q:我正在编写一个代码来压平2d列表,如[[1,2], [3], [4,5,6]。我希望他们像[1,2,3,4,5,6]一样在一个列表中。

A:为了简洁起见,请使用java流功能Stream::flatMap,它使结构变平:

List<Integer> list = vec2d.stream().flatMap(List::stream).collect(Collectors.toList());

在java-8版本之前,对于这个问题,每个用法都有足够的。

Q:。。。colIter == null!colIter.hasNext()有什么区别?

A:colIter == null检查迭代器本身是否为null。默认情况下,从任何现有集合返回迭代器都不会产生类似null的迭代器。

colIter.hasNext()是从迭代程序调用的方法,根据其文档,如果迭代有更多元素,则返回true,这意味着Iterator::next的后续调用将返回一个元素,并且不会抛出NoSuchElementException

相关内容

  • 没有找到相关文章

最新更新