iterator = null 和 hasnext = false 有什么区别?

What's the difference between a iterator = null and hasnext = false?

我正在编写代码来展平二维列表,例如 [[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();
        }
    }
}

Q: I am writing a code to flatten a 2d list, like [[1,2], [3], [4,5,6]. I want them to be in one list like [1,2,3,4,5,6].

A: 为简洁起见,使用 feature Stream::flatMap 来展平结构:

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

之前的版本,这个问题的 for-each 用法已经足够了。

Q: ... what's the difference between colIter == null and !colIter.hasNext()?

A: colIter == null 检查迭代器本身是否为空。默认情况下,从任何现有集合中 return 迭代器永远不会产生 null 相似的迭代器。

colIter.hasNext() 是从 Iterator 调用的方法,根据其 documentation returns true if the iteration has more elements that implies that the subsequent call of Iterator::next 将 return 一个元素并且不会抛出 NoSuchElementException.

如果你使用嵌套列表...

[ [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。您可能 想调查一下。