Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Поиск в коллекции по типу  [new]
GrossmasteR
Member

Откуда:
Сообщений: 39
Уважаемый форумчане, здравствуйте. Нужен ваш совет.
Допустим у меня есть класс A и, к примеру, три его наследника: B, C и D.
Я создаю коллекцию, скажем ArrayList list, кладу туда list.put(new B()) кого-то или всех из наследников.
Вопрос, как мне проверить, что в коллекции содержатся все наследники? Именно не найти лишних, не убедиться, что все они наследники, а выяснить все ли из трех на месте или кого нет? Пожалуйста, подскажите
24 мар 20, 18:30    [22105310]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
GrossmasteR,
Циклом
24 мар 20, 18:46    [22105325]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
GrossmasteR
Member

Откуда:
Сообщений: 39
PetroNotC Sharp, а есть возможность поподробнее.
мне нужен какой-то contains по типу или instanceof наоборот что ли.
То есть допустим у меня есть, пусть будет, Arraylist list. Я туда положил, к примеру, только 1 из 3 наследников list.put(new B())
И потом я проверяю как-то A "instanceof наоборот" list.get(i) — false, а B "instanceof наоборот" list.get(i) — true и т.д. Итого двух таких то не хватает
24 мар 20, 18:48    [22105327]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
забыл ник
Member

Откуда:
Сообщений: 3241
GrossmasteR
Уважаемый форумчане, здравствуйте. Нужен ваш совет.
Допустим у меня есть класс A и, к примеру, три его наследника: B, C и D.
Я создаю коллекцию, скажем ArrayList list, кладу туда list.put(new B()) кого-то или всех из наследников.
Вопрос, как мне проверить, что в коллекции содержатся все наследники? Именно не найти лишних, не убедиться, что все они наследники, а выяснить все ли из трех на месте или кого нет? Пожалуйста, подскажите


Правильный ответ такой - тебе надо не это, просто у тебя есть некая проблема которую ты тщательно скрываешь почему-то, придумал костыль чтобы его решить и будешь до последнего отпираться что это не так.
Использовать в одной коллекции объекты разных типов, пусть и наследников - это очень короткий путь прострелить себе ногу. Тебе надо понять что привело к этой ситуации и передизайнить систему, это единственный правильный вариант. Скорее всего ты скажешь - так задизайнено, не мое это дело, скажите просто как и т.д. - в таком случае ответ Petro самый разумный - цикл
24 мар 20, 18:53    [22105331]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
Что такое "instanceof наоборот' ?

Для меня, наоборот это поменять

A instanceof B
на
B instanceof A
24 мар 20, 18:54    [22105332]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
GrossmasteR
что все они наследники, а выяснить все ли из трех на месте или кого нет? Пожалуйста, подскажите


Циклом.

there_is_B boolean = false;
there_is_C boolean = false;
there_is_D boolean = false;
for ( )....
if ( there_is_B && there_is_C && there_is_D ) { return "OK"; } else { return ""; }
24 мар 20, 18:58    [22105335]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
GrossmasteR
instanceof наоборот"
)))
Возле компа?
Давай свой код. Че стеснятся.
24 мар 20, 19:08    [22105343]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
GrossmasteR
Member

Откуда:
Сообщений: 39
Кода нет. Это учебная задача.
public static void main(String[] args) {
        List<A> list = new ArrayList<>();
        list.add(new B());
        list.add(new C());
        list.add(new D());
        System.out.println(foo(list));
 
    }
 
    private static boolean foo(List<? extends A> list) {
        boolean isB = false, isC = false, isD = false;
        for (A a : list) {
            if (a instanceof B) isB = true;
            if (a instanceof C) isC = true;
            if (a instanceof D) isD = true;
        }
        return isB && isC && isD;
    }


Как узнать, какого именно наследника из B,C,D не хватает, если кого-то не хватает?
24 мар 20, 19:48    [22105369]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
fixxer
Member

Откуда:
Сообщений: 770
Чему призвана научить эта задача и в каком виде изначально сформулирована?

В общем виде задача в java не решаема. Придется так или иначе знание о подклассах включать в код. Проще всего завести Set<Class<?>> subclasses и потом сравнивать с этим сетом свой лист. Алгоритм проходится на первом курсе в разделе "двумерные массивы".
24 мар 20, 20:24    [22105400]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8475
GrossmasteR
Кода нет. Это учебная задача.
public static void main(String[] args) {
        List<A> list = new ArrayList<>();
        list.add(new B());
        list.add(new C());
        list.add(new D());
        System.out.println(foo(list));
 
    }
 
    private static boolean foo(List<? extends A> list) {
        boolean isB = false, isC = false, isD = false;
        for (A a : list) {
            if (a instanceof B) isB = true;
            if (a instanceof C) isC = true;
            if (a instanceof D) isD = true;
        }
        return isB && isC && isD;
    }


Как узнать, какого именно наследника из B,C,D не хватает, если кого-то не хватает?

В чем проблема?

if ( ! isB ) { System.out.println( "There is not B" ); }
if ( ! isC ) { System.out.println( "There is not C" ); }
if ( ! isD ) { System.out.println( "There is not D" ); }
24 мар 20, 20:38    [22105411]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в коллекции по типу  [new]
GrossmasteR
Member

Откуда:
Сообщений: 39
Leonid Kudryavtsev, о, то что надо. Спасибо, спасибо большое
24 мар 20, 20:51    [22105423]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить