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

时间:2019-01-23 21:26:45

标签: java list null iterator listiterator

我正在编写代码以简化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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

  

问::我正在编写代码以简化2d列表,例如changeName<- function(old_name, new_name){ file.rename(paste0(old_name,'.jpg'), paste0(new_name,'.jpg')) } mapply(changeName, table_dfs_final$id_senador,table_dfs_final$name_lower) 。我希望它们像[[1,2], [3], [4,5,6]这样的列表。

A:为简洁起见,请使用功能Stream::flatMap来简化结构:

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

版本之前,此问题的每个用法都足够。

  

问: ... ... List<Integer> list = vec2d.stream().flatMap(List::stream).collect(Collectors.toList()); colIter == null有什么区别?

A: !colIter.hasNext()检查Iterator本身是否为null。默认情况下,从任何现有集合中返回迭代器都不会导致类似colIter == null的迭代器。

null是从迭代器调用的方法,根据迭代器的documentation,如果迭代中包含更多元素,则意味着返回Iterator::next的后续操作将返回colIter.hasNext()元素,并且不会抛出true

答案 1 :(得分:0)

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

[ [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。您可能希望对此进行调查。