Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Есть ли способ итерировать только по обьектам определенного класса?

7.0K
23 апреля 2009 года
pink master
79 / / 21.10.2006
Часто происходит ситуация что у меня есть контейнер с обьектами базового класса, а по сути меня интересуют только обьекты определенного подкласса. Есть ли какой-нибудь стандартный фильтрующий итератор или в духе? А то как то не красиво каждый раз писать:
 
Код:
ArrayList<MyObj> toKill = new ArrayList<MyObj>();
for(MyObj o : container) {
    if (o instanceof MyDerObj) {
        MyObj der = (MyDerObj) o;
        toKill.add(chip);
    }
}
Может есть что покрасивее?
1.9K
23 апреля 2009 года
Goblin
55 / / 02.03.2004
Дык напиши сам.
java.util.Enumeration в помощь
355
23 апреля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
для это дела лучше http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Iterable.html
ну и соответствующий итератор
7.0K
24 апреля 2009 года
pink master
79 / / 21.10.2006
[QUOTE=<SCORP>;282751]для это дела лучше http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Iterable.html
ну и соответствующий итератор[/QUOTE]
Я так сразу и подумал сделать, но только там же метод iterator() надо реализовывать. А у меня в иерархии довольно много классов, все от одного базового и хранятся в одном списке с ссылками на базовый класс. А хочется иногда без лишних инстансофоф пробежать список по оперделенным подклассам. Мне нужно передавать по какому конкретно классу хочу пробежаться, а методу iterator() это передать некуда. Может есть какой стандартный механизм? Ведь в джаве без обобщенных классов все время были контейнеры Object, и такая ситуация встречалась оч часто.
7.0K
24 апреля 2009 года
pink master
79 / / 21.10.2006
Цитата: Goblin
Дык напиши сам.
java.util.Enumeration в помощь



Так как раз и не хочу сам писать - вдруг уже есть что то стандартное. Я с джавером совсем недавно устроился, не хочу писать нубские велосипеды^^
Посмотрел Enumeration - то же самое что и с Itarable (см. выше).

355
24 апреля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
по идее можно попробовать сделать что-то типа ClassFilterIterator<? Class> с конструктором ClassFilterIterator(Iterator). а next() у него будет проверять элемент на instanceof и возврящать, если надо, или скипать
7.0K
24 апреля 2009 года
pink master
79 / / 21.10.2006
[QUOTE=<SCORP>;282818]по идее можно попробовать сделать что-то типа ClassFilterIterator<? Class> с конструктором ClassFilterIterator(Iterator). а next() у него будет проверять элемент на instanceof и возврящать, если надо, или скипать[/QUOTE]

Ну да, я типо того и сделаю. Просто решил перед этим спросить, а то опасался что сделаю, начну юзать а потом узнаю что это уже есть. А потом придут еще люди в проэкт и будут мои велосипеды гонять)))
Я наверно сделаю так:
Iterator<Class> getIterator(Class class) {...}
P.S. Если вдруг кто знает что такая тема уже есть, напишите плиз)))
355
24 апреля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
я почему предложил через конструктор - тогда не придётся сабкласить список и при этом фильтрующий итератор будет доступен из любого места программы. достаточно будет сделать лишь
Iterator i = new ClassFilterIterator<MyClass>(myList.iterator());

а если делать Iterator<Class> getIterator(Class class), то прийдётся порождать подкласс от списка и потом его пользовать. что есть в общем-то не весело. вот вы сейчас ArrayList пользуете, а решите потом на LinkedList пересесть. а у него нетути такого фильтрующего итератора - придётся писать ;)

как вариант - вынести этот метод куда-нить и сделать статическим и ещё параметр добавить Collection или Iterator, чтобы реюзать можно было удобней
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог