В чем разница между итератором = null и hasnext = false? - PullRequest
0 голосов
/ 24 января 2019

Я пишу код для выравнивания двухмерного списка, например [[1,2], [3], [4,5,6]].Я хочу, чтобы они были в одном списке, как [1,2,3,4,5,6].когда я хочу проверить, находится ли колитер в конце одной строки, я хочу, чтобы они перешли на следующую строку.

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 голосов
/ 24 января 2019

Если вы возьмете свой вложенный список ...

[ [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.Вы можете захотите разобраться в этом.

0 голосов
/ 24 января 2019

Q: Я пишу код для выравнивания двухмерного списка, например [[1,2], [3], [4,5,6].Я хочу, чтобы они были в одном списке, например [1,2,3,4,5,6].

A: Для краткости используйте функцию Stream::flatMap, который выравнивает структуру:

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

До версии , для этой проблемы достаточно использования для каждого.

Q: ... в чем разница между colIter == null и !colIter.hasNext()?

A: colIter == null проверяет,Итератор сам по себе равен нулю или нет.По умолчанию возврат итератора из любой существующей коллекции никогда не приводит к null подобному Итератору.

colIter.hasNext() - это метод, вызываемый из Итератора, который согласно его документации возвращает true если в итерации больше элементов, это означает, что последующий вызов Iterator::next вернет элемент и не выдаст NoSuchElementException.

...