2012-06-27 2 views
1

У меня есть вопрос относительно поведения итератора в Java.Поведение итератора в Java

У меня есть вызов, например, как это:

myIterable.iterator().hasNext()

Если этот вызов возвращает истину, я могу быть уверен, что коллекция имеет по крайней мере два элемента? Из спецификации API Java я мог только узнать, что истина означает, что есть еще один элемент, который может быть достигнут next(). Но что произойдет, если указатель находится в самом начале (то есть ли hasNext() может распознавать первый элемент отдельно)

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html

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

[Редактировать]

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

+0

'myIterable.iterator()' всегда начинается в начале итерации. –

+0

Если вы * можете * хранить элементы, вы можете поместить их в список (или любую другую коллекцию) и получить размер коллекции с помощью метода 'size()'. Вы всегда можете перебирать новую коллекцию. В противном случае вам нужно будет получить количество элементов другим способом. –

+0

Примечание: вам не нужно использовать «спасибо» все время (на самом деле это не политика). Не нужно также добавлять [РЕШЕНО] к вопросу, вы приняли ответ. Вы не можете/не должны использовать это, чтобы получать меньше ответов, это один из побочных эффектов использования stackoverflow :) –

ответ

2

hasNext(), возвращающий true или false, позволяет различать нулевые элементы и один или более (в начале итерации).

Вы хотите знать, имеет ли он два или более, без запуска итерации. Я думаю, в принципе, вы не можете. Предоставление этой информации больше, чем должен делать итератор: сделать доступным следующий и только следующий элемент (и информацию о том, существует ли этот элемент).

Возможно, у итератора уже нет этого знания!

Но, конечно, вы можете запомнить предметы, которые вы уже выбрали из списка. Затем вы можете использовать их позже, как только вы узнаете, что на самом деле есть два или более элементов в списке.

Если вам нужно передать итератор другому коду, вы можете написать свой собственный класс, который реализует итератор, внутренне запоминает первые два элемента в качестве переменных-члена и передает их первым, а затем продолжает итерацию по остальной части элементы в исходном итераторе (если их еще осталось) - ссылка на исходный итератор поэтому также должна быть сохранена в вашем сделанном пользователем итераторе

+0

проблема в том, что эти два элемента могут быть очень большими, не могут вписаться в основную память. Я хочу только знать коллекцию, имеет ли она ровно два элемента или нет. Вот и все, ничего больше. Очевидно, это невозможно. – Bob

+0

Ах, подождите, я тоже сейчас прочитал, что вам нужно проверить, есть ли ровно * два элемента. Если вы не можете уменьшить размер такого элемента до его передачи, это действительно не сработает. Обратите внимание, что тот факт, что оба элемента вместе могут быть слишком большими, чтобы соответствовать памяти, также является ответом на то, почему хорошо, что ваш Итератор не должен знать об обоих из них одновременно: он тоже должен был бы их хранить в памяти ... – Jochem

+0

Что делать, если в итерируемом объекте есть только один элемент, я могу использовать myIterable.iterator(). next(), чтобы получить этот объект, если не как получить этот объект? – Switch

5

это может означать первый. Вы можете быть уверены в том, что она имеет больше нуля элемент

+0

В противном случае вы никогда не сможете получить первый элемент. Существует только 'next()', no 'current()'. –

+0

@owlstead, как я могу узнать, имеет ли итератор ровно два элемента для итерата? Конечно, я могу перебирать и подсчитывать, но я не могу вернуться или повторить дважды или клонировать итератор в моем случае, это hasoop iterable – Bob

+0

@Gergely, как бы я знал, будет ли итератор проходить ровно два элемента без итерации через Это? Я не могу перебирать, потому что не могу повториться.Мне нужно знать количество элементов перед итерацией. Это hasoop-фреймворк, специфичный для итерации, то есть не клонируемый и не повторяющийся. – Bob

1

hasNext говорит вам, что есть еще один элемент, доступный с next() только. Значит, это означает, что у вас есть хотя бы один элемент.

+0

, как я могу узнать, имеет ли итератор ровно два элемента для итерата? Конечно, я могу повторять и подсчитывать, но я не могу вернуться или повторить или повторить итератор в моем случае, это hasoop iterable – Bob

+1

@Bob: вы этого не делаете. Вот как работают итераторы: (Кроме того, если вы считаете, что ваш исходный вопрос был дан, пожалуйста, отметьте соответствующий ответ, если не затем перефразируйте свой вопрос. –

2

Java-итераторы расположены до кулачный элемент. Какое ваше выражение myIterable.iterator().hasNext() показывает, что существует хотя бы один элемент.

-2

Итератор несет ответственность за итерацию Поведение по сборке.

Для идентификации пустота коллекции, call list.isEmpty().

Чтобы определить размер коллекции, call list.size().

+1

И определить, что 'Iterable' не пуст? –

+0

@MarkoTopolnik Я предполагаю, что это уже ясно для всех. – JMelnik

+1

Моя точка зрения, OP имеет «Итерабельный». –

1

Если myIterable.iterator().hasNext()true это значит, что существует хотя бы один элемент, и вы можете использовать next(), чтобы получить доступ к этому.

1

Нет, если hasNext() возвращает истинные средства, что сбор, имеющий по крайней мере один элемент потому что позиция происхождения итератора должен перед первым элементом.

List l = new ArrayList(); 
l.add(1); 
Iterator it = l.iterator(); 
while (it.hasNext()) { 
System.out.println(it.next()); 
} 

Результат будет потому позиция происхождения итератора должен перед первым элементом. Когда мы проверим это.hasNext() для первый раз, он вернет true, потому что он имеет один элемент. Затем напечатайте элемент, используя it.next(). Теперь только, итератор в первой позиции. Когда мы проверим it.hasNext() для второй раз, он вернет false.

1

Как я могу узнать, имеет ли итератор ровно два элемента для итерата? Конечно, я могу повторять и подсчитывать, но я не могу вернуться или повторить дважды или клонировать итератор в моем случае, это isoop iterable.

Невозможно сделать это. Возможно, итератор ошибочен для вашего сценария.

0

В итераторе у него есть поле с именем cursor.This значение инициализации курсора это размер объекта коллекции. Когда вы вызываете метод next(), он будет -. Метод hasNext() проверяет, что курсор равен нулю. Он равен нулю, возвращает false, else возвращает true.

Но список и карта не совпадают, их отличие - конкретная реализация, оригинал тот же. Размер проверки проверки, конечный узел проверки карты.

 Смежные вопросы

  • Нет связанных вопросов^_^