簡體   English   中英

在Java中,如何檢查集合是否包含特定類的實例?

[英]In Java, how can I check if a collection contains an instance of a specific class?

例如(這是非常簡化的),假設我有一張卡片中的每張卡片的類......例如KingOfSpaces類, QueenOfSpades類, JackOfDiamonds類等等。所有這些都擴展了Card KingOfSpaces可能有多個實例。

我有一個ArrayList<Card> ,里面有5個對象。 如何查看該ArrayList包含至少一個AceOfDiamonds

讓我們首先指出,使用類進行這種區分幾乎肯定是一件壞事。 我要說你可能需要讓'Card'更聰明一些(即使用getSuit()和getOrdinal()方法)。

但是,如果你堅持這樣做,迭代數組列表(你可以google - 這是一個非常基本的東西)並使用instanceof運算符比較列表中的每個條目。

您將此問題標記為與“反射”有關,這似乎並不正確。 你確定你不打算把它作為“家庭作業”嗎?

好的 - 到底是什么,這是代碼:

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

但請不要設置你的班級層次結構 - 這是一個可怕的設計。

試試instanceof運算符:

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

@Daniel Pereira按要求回答了這個問題。 我想提出你真正想要的是一個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
}

你可以像這樣擴展List:

public class XList<T> extends ArrayList {

    public boolean hasInstanceOf(Object obj) {
        for (Class<?extends Object> item: (Collection<Class<? extends Object>>)this ) {
            if (item.isInstance(obj)) return true;
        }
        return false;
    }

}

此解決方案允許您,您可以動態檢查類型而不是僅靜態類型。

你可以像這樣實現List:

xList<Class> classTypes = new xList<Class>();
if (classTypes.hasInstanceOf(item.getClass())){
    return true;
}

您可以使用以下代碼:

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'

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;
}

檢查對象的類型實質上違反了各種面向對象的原則。 您可能想要回答的問題是,一旦找到該類型的對象,您打算做什么。

要執行的動作是必須為每種類型建模的動詞。 例如,在單人紙牌游戲中,當你點擊一張牌時,你可以把它放在右側的籌碼上。 因此,卡是否可以落在堆棧上的能力取決於對象本身,因為它知道它的身份。 所以基本上你必須為每張卡實現一個deal()方法,並根據它的對象,它知道如何為它的實例實現deal()。 通過在對象外部進行(並檢查類型),您實際上已經破壞了封裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM