我正在编写代码以简化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();
}
}
}
答案 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:为简洁起见,请使用java-stream功能Stream::flatMap
来简化结构:
[1,2,3,4,5,6]
在java-8版本之前,此问题的每个用法都足够。
问: ... ...
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
。您可能希望对此进行调查。