Подтвердить что ты не робот

В Java, как я могу проверить, содержит ли коллекция экземпляр определенного класса?

Например (и это очень упрощено), предположим, что у меня есть класс для каждой карты в колоде карт... например. класс KingOfSpaces, класс QueenOfSpades, класс JackOfDiamonds и т.д. Все из них расширяются Card. Может быть несколько экземпляров KingOfSpaces.

И у меня есть ArrayList<Card>, в котором есть 5 объектов. Как я могу проверить, содержит ли этот ArrayList хотя бы один AceOfDiamonds?

4b9b3361

Ответ 1

Пусть начнется, указав, что использование классов для такого рода дифференцирования почти наверняка является плохим. Я бы сказал, что вам, вероятно, нужно сделать "Карту" немного более умным (т.е. Иметь метод getSuit() и getOrdinal()).

Но если вы настаиваете на том, чтобы сделать это, перечислите список массивов (вы можете Google, что - это довольно простая вещь) и сравнить каждую запись в списке с помощью оператора instanceof.

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

ОК - что за черт, вот код:

List<Card> hand = ...;
for(Card card : hand){
  if (card instanceof AceOfDiamonds) return true;
}

но, пожалуйста, не устанавливайте иерархию своего класса - это ужасный дизайн.

Ответ 2

Попробуйте оператор instanceof:

if (myObject instanceof myType) {
    System.out.println("myObject is an instance of myType!");
}

Ответ 3

@Даниэль Перейра отвечает на вопрос по заданию. Я хотел бы предложить, что вы действительно хотите enum.

Примеры:

enum Card {
    KingOfSpades,
    QueenOfSpades,
    JackOfSpades,
    // etc
    AceOfDiamonds;
}

Card myCard = ...;
if(myCard == Card.KingOfSpades) {
    // stuff
}

Set<Card> cards = new EnumSet<Card>(Card.class);
cards.add(...);
if(cards.contains(myCard)) {
   // stuff
}

Ответ 4

Вы можете использовать следующий код:

private boolean findInstance(ArrayList items, String className) {
    boolean tag = false;
    for (int i = 0; i < items.size(); i++) {
        if (items.get(i).getClass().getName().equals(className)) {
            tag = true;
            break;
        }
    }
    return tag;
}

'className' включает имя пакета, например: 'java.lang.String'

Ответ 5

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

Действие, которое нужно выполнить, будет глаголом, который должен быть смоделирован для каждого типа. Например, в игре Solitaire, когда вы нажимаете на карту, вы можете поместить ее в стек справа, если это туз. Так что способность, которую карта может приземлиться в стеке, определяется самим объектом, поскольку она знает свою идентичность. Таким образом, по сути, вам нужно реализовать метод deal() для каждой карты и на основе того, что это за объект, он знает, как должна быть реализована сделка() для своего экземпляра. Выполняя это за пределами объекта (и проверяя тип), вы по существу сломали инкапсуляцию.

Ответ 6

public static <E> boolean containsInstance(List<E> list, Class<? extends E> clazz) {
    for (E e : list) {

        try {
            List<E> list2 = (List<E>) e;
            for (E list21 : list2) {
                System.out.println("<< ENCONTRO LISTA DENTRO DEL ARRAY DE OBJETOS >> ");
                if (clazz.isInstance(list21)) {
                    return true;
                }
            }
        } catch (Exception q) {
            System.out.println("<< ENCONTRO OBJETO DENTRO DEL ARRAY DE OBJETOS >> ");
            if (clazz.isInstance(e)) {
                return true;
            }
            continue;
        }

    }
    return false;
}