2

スーパークラスのアイテムとそのサブクラスのアイテムを含む配列リスト「アイテム」があります。

    for (Item item : items)
    {
        if (item.getLocation() == location)
        {   
            System.out.println(item.getDescription() + " is in this location");
            if (item instanceof Monster)
            {
                Monster monster = (Monster)item; 
                if (monster.hasDied())
                {
                    System.out.println(monster.getDescription() + " has been defeated!");
                    items.remove(monster);     
                }
            }   
        }   
    } 

モンスターが死亡したことが判明した場合、配列リストからモンスターを削除しようとしています。すべてのメソッドが機能しており、上記のように foreach ループ中に arraylist からアイテムを削除できないことを認識しています。以前、配列リストからモンスターを削除するために以下のコードを使用しましたが、これは個別の「アイテム」と「モンスター」配列リストがあった場合でした。「Monster」クラスは「Item」クラスのサブクラスであるため、これらは両方とも同じ「items」配列リストにあります。

    Iterator<Monster> iter = monsters.iterator();
    while (iter.hasNext()) 
    {
        Monster monster = iter.next();
        if (monster.hasDied())
        {
            if (monster.getLocation() == location)
            {
                System.out.println(monster.getDescription() + " has been defeated!");
                iter.remove();
            }
            else
            {
               iter.remove(); 
            }
        }
    }

とにかく、指定されたモンスターを配列リストから削除するためにどちらかのアプローチを適応させることはできますか?

ご協力いただきありがとうございます!

4

4 に答える 4

3

絶対に - あなたがする必要があるのは、あなたが持っている2つのアプローチを組み合わせることだけです:

  • Iterator2 番目の方法で行った方法を使用して、リストを繰り返します。
  • 電流が最初のアプローチで行う方法であることを確認してitemくださいMonster。この組み合わせにより、イテレータを使用してMonsterとit を見つけることができます。remove

これを行う方法は次のとおりです。

Iterator<Item> iter = items.iterator();
while (iter.hasNext()) 
{
    Item item = iter.next();
    if (item instanceof Monster)
    {
        Monster monster = (Monster)item; 
        if (monster.hasDied())
        {
            if (monster.getLocation() == location)
            {
                System.out.println(monster.getDescription() + " has been defeated!");
                iter.remove();
            }
            else
            {
               iter.remove(); 
            }
        }
    }
}
于 2013-07-04T09:41:20.313 に答える
1

型チェックを回避するポリモーフィック メソッドは次のようになります。このメソッドでは、すべての s の有効性をチェックでき、それ自体が有効でない場合に何をするかを知っているため、特定の sItemが a であるかどうかは問題ではありません。MonsterItemItem

public class Item {
    //assorted item methods


    public boolean isStillValid(){
        return true; //by default items remain valid
    }

    public String getDescription(){
        return "SomeItem"; //I assume you can provide a better description than this, I don't know your usage case so can't comment
    }

    public String getNoLongerValidText(){
        return getDescription() + "is no longer valid"; //items that actually become invalid should override this and give a better text
    }
}


public class Monster extends Item{

    //assorted extra Monster Methods

    int health=100;

    public boolean isStillAlive(){
        if (health<=0){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public boolean isStillValid() {
        return isStillAlive();
    }

    @Override
    public String getDescription() {
        return "MonsterName";
    }

    @Override
    public String getNoLongerValidText() {
        return getDescription() + "has died";
    }

}

すべてのアイテムの有効性をチェックできるため、特定のアイテムItemMonster

Iterator<Item> iter = items.iterator();
while (iter.hasNext()) 
{
    Item item = iter.next();
    if (item.isStillValid()==false)
    {
        System.out.println(item.getNoLongerValidText());
        iter.remove();
    }
}

これは、他Itemの s (たとえば、特定の使用回数しかないポーション ( Potion extends Item) など) も無効になる可能性がある場合に適切にスケーリングされるため、特に優れています。

于 2013-07-04T10:04:36.453 に答える
0

何を達成しようとしているのかはわかりませんが、なぜこのように単純に記述しないのでしょうか。

    for (Iterator<Item> iter = items.iterator(); iter.hasNext();) {
            Item item = iter.next();
            if (item instanceof Monster) {
                    Monster monster = (Monster) item;
                    if (monster.hasDied()) {
                        if (monster.getLocation() == location) {
                            System.out.println(monster.getDescription() + " has been defeated!");
                        }
                        iter.remove();
                    }
            }
     }
于 2013-07-04T09:47:49.347 に答える