我正在编写一个代码来压平一个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
。