2013-03-14 2 views
2

Я предоставляю библиотеку для другой команды. Один из методов, которые я предоставляю, получает в качестве аргумента Итератор. Я хотел бы как-то потребовать определенного порядка итерации. Есть ли способ сделать это в коде, расширив Iterator?Выполнение заказа в Java Iterator

+4

Поскольку вы получаете итератор, и вы * требуете * что-то, это требование должно быть как минимум указано в документации вашего метода. – akaIDIOT

+0

Итератор может быть из коллекции, которая будет или не будет поддерживать порядок. – rajesh

+0

В дополнение к akaIDIOT вы можете проверить состояние своего заказа во время итерации и выбросить 'IllegalArgumentException', если порядок отклонится. – Kai

ответ

1

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

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

+0

Спасибо. Как указано выше, akaIDIOT, я укажу это требование в документации. Я все еще не уверен, является ли проверка требования и выбрасывание исключения хорошей идеей. Я не буду хранить элементы в списке, так как мой итератор - это просто оболочка для базы данных ResultSet, которая потенциально может быть довольно большой. – MrMulliner

0

Вы переданы, как аргумент, экземпляр некоторого конкретного класса, который реализует Iterator. Вы не можете расширить свой класс, потому что его класс определяется после создания экземпляра, который выполняется с помощью кода, который вызывает ваш метод.

Если вы хотите потерпеть неудачу быстро, когда требуемый порядок не соблюдается, попробуйте Guava's Ordering.isOrdered() method.

NB Это будет работать только если ваш аргумент является Iterable, а не итератора. Вам нужно, чтобы он был Iterable (интерфейс, который позволяет вам извлекать Iterator), чтобы вы могли повторять итерацию дважды: один раз для проверки порядка, один раз для обработки.