2016-04-05 9 views
2

これはすでに回答済みの方にお詫び申し上げます。私は見てみましたが、答えが見つかりませんでした。特定のクラスのインスタンスがリストに存在するかどうかを調べる

ここでは、リンクされたリストユーティリティクラス(一方向にリンクされています)には、さまざまな用途のさまざまなユーティリティメソッドが含まれています。私がしようとしているのは、指定されたクラスのインスタンスをparametreとして取ることができるメソッドを作成し、そのクラスのインスタンスがリストに存在するかどうかをチェックし、そうであればtrueを返し、しません。リスト自体には、いくつかの異なるクラスのインスタンスが含まれています。

この方法は、ゲームボード上のスペースの内容を詳述するリストと共に使用されます:スペースに敵が含まれている場合は、敵のアイコンを表示し、スペースが通過できないようにします。アイテムのアイコンを表示するなど、などがあります。実際のキッカーは、メソッドがすべてのクラスに対処できなければならないということです。そのため、私は次のようなものを使用できません:

if(foo instanceof Enemy) { 。 。 。 }

ここで私が最初に実行しようとしましたものです: //このメソッドは、LinkedListのクラス内

public boolean exists(Object o) 
{ 
    int i = 0; 
    boolean output = false; 
    //koko() returns the size of the linked list 
    while(i < koko() && !output) 
    { 
     //alkio(i) returns an Object type reference to the entity in index i 
     if(alkio(i) instanceof o.getClass()) 
     { 
      output = true; 
     } 
    } 
    return output; 
} 

ですが、それはこのの結果:はい、これは宿題ですhttps://www.dropbox.com/s/5mjr45uymxotzlq/Screenshot%202016-04-06%2001.16.59.png?dl=0

(またはむしろ大きな宿題の一部ですが)先生は午前2時に答えず、私のgoogle-fuは弱すぎます。これについて

HALPプラザ

  • ナール
+0

「クラス」の代わりにオブジェクトを入力するのはなぜですか? –

+0

クラスをパラメータとしてどのように取りますか?それは最も簡単なことですが、私はこれが可能であることを十分に認識していませんでした...構文は何ですか? – Narmondur

+0

o.getClassは何を返すと思いますか? 'Class'を返します。あるいは、文字列 'MyClass.class'を書くこともできます。 –

答えて

1

instanceofを行うための動的な方法がClass.isInstance()メソッドを使用することです:指定された場合

が決定しObjectこのClassで表されるオブジェクトと割り当て互換です。このメソッドは、Java言語instanceofオペレータと動的に等価です。

したがって、alkio(i) instanceof o.getClass()o.getClass().isInstance(alkio(i))と書かれています。

+0

:確かに:メソッドに与えられたパラメータがFoo alkio(i)によって返された参照は、例えば、オブジェクトのクラスのインスタンスを指しています。あなたが私に言ったメソッドは、falseを返すでしょうか? – Narmondur

+0

逆に、インデックスiのエンティティがFoo型であればtrueを返します。 – Narmondur

+0

@Narmondur Correct。 – Andreas

0

どのように?

public static void main(String[] args) 
{ 
    Integer myInt = 1; 
    System.out.println(exists(Arrays.asList(1, 2, 3), myInt)); //true 
    System.out.println(exists(Arrays.asList("1", "2", "3"), myInt)); //false 

} 

/** 
* Returns whether an object exists in @list that is an instance of the class of object @o. 
*/ 
public static boolean exists(List<?> list, Object o) 
{ 
    return list == null || o == null ? false : list.stream().filter(o.getClass()::isInstance).findAny().isPresent(); 
} 
+0

私はこのことを理解できません...ごめんなさい。 – Narmondur

0

私はその後、正しくあなたの質問を理解していれば、あなたの方法ではなく、クラスのインスタンスにクラスを渡す必要があります。

public boolean exists (Class checkClass) { 
    ... 
    if (item.getClass().equals(checkClass)) { 
     return true; 
    } 
    ... 
} 

あなたはその後、としてこれを呼び出す:

if (myList.exists(Enemy.class)) { 
    ... 
} 

ただし、これはかなり貧弱なオブジェクト指向設計を示すので、別のモデルを検討する必要があります。より良いアプローチは、マップ上にあるすべてのものを表すinterfaceを持つことです。次のようなものがあります。

public enum MapObjectType { 
    ENEMY, ALLY, WALL; 
} 

public interface MapObject { 
    MapObjectType getType(); 
} 

マップを表すリストに配置できる各クラスは、このインターフェイスを実装する必要があります。たとえば:

public class Enemy implements MapObject { 

    @Override 
    public MapObjectType getType() { 
     return MapObjectType.ENEMY; 
    } 
} 

次に、あなたの方法は、より賢明かもしれない:

public boolean hasObjectOfType(MapObjectType type) { 
    ... 
    if (item.getType().equals(type)) { 
     return true; 
    } 
    ... 
} 
+0

これは非常にきれいに聞こえる...私が正しく理解するならば、enumにはマップに入るすべてのものが含まれており、インターフェースとは何ですか?リンクリストはそのインターフェースを実装していますか?インタフェースMapObjectには、上記のメソッドだけが含まれていますか? – Narmondur

+0

@Narmondur enumはマップに入るオブジェクトのタイプを表します。オブジェクトの各クラスは、インタフェースを実装する必要があります。私は答えに例を追加します。 – sprinter

+0

私はClass.isInstance()メソッドを使ってこれを解決しました。主に、教師が列挙型の使用を少し嫌うと思っていたからです。私たちはそれらを理解していないので、私はあまり気にしませんでした。私のスキルレベルをはるかに上回るコースと言われました)。その上で、別のクラスのために特別に私が作ったメソッドを使うと、リンクされたリストのこの特定の実装が持つべき汎用性が失われます。 私はこのページをどこかに保存するつもりです。あなたの返事が、私が将来使用する貴重な情報を与えたからです。 ありがとうございました:) – Narmondur

関連する問題