13

私の問題の短い例を作成しました。オブジェクトのリストを匿名で作成し、ArrayList. アイテムが入ったら、ArrayList後で戻ってきて、リスト内の各オブジェクトにさらに情報を追加します。インデックスがわからない場合、リストから特定のオブジェクトを抽出する方法はありますか?

私はオブジェクトの「名前」しか知りませんが、何もできませんlist.get(ObjectName)。これを処理するための推奨される方法は何ですか? 1 つの特定のオブジェクトを取得するたびに、リスト全体を反復処理する必要はありません。

public class TestCode{

    public static void main (String args []) {
        Cave cave = new Cave();

        // Loop adds several Parties to the cave's party list
        cave.parties.add(new Party("FirstParty")); // all anonymously added
        cave.parties.add(new Party("SecondParty"));
        cave.parties.add(new Party("ThirdParty"));

        // How do I go about setting the 'index' value of SecondParty for example?
    }
}

class Cave {
    ArrayList<Party> parties = new ArrayList<Party>();
}

class Party extends CaveElement{
    int index;

    public Party(String n){
        name = n;
    }

   // getter and setter methods 

    public String toString () {
        return name;
    }
}


class CaveElement {
    String name = "";
    int index = 0;

    public String toString () {
        return name + "" + index;
    }
}
4

7 に答える 7

15

の使用を考えると、List反復せずに値を「検索」する方法はありません...

例えば...

Cave cave = new Cave();

// Loop adds several Parties to the cave's party list
cave.parties.add(new Party("FirstParty")); // all anonymously added
cave.parties.add(new Party("SecondParty"));
cave.parties.add(new Party("ThirdParty"));

for (Party p : cave.parties) {
    if (p.name.equals("SecondParty") {
        p.index = ...;
        break;
    }
}

さて、これには時間がかかります。探している要素がリストの最後にある場合、一致する要素を見つける前にリストの最後まで反復する必要があります。

Mapある種のを使用する方が良いかもしれません...

したがって、次のように更新Caveすると...

class Cave {
    Map<String, Party> parties = new HashMap<String, Party>(25);
}

次のようなことができます...

Cave cave = new Cave();

// Loop adds several Parties to the cave's party list
cave.parties.put("FirstParty", new Party("FirstParty")); // all anonymously added
cave.parties.put("SecondParty", new Party("SecondParty"));
cave.parties.put("ThirdParty", new Party("ThirdParty"));

if (cave.parties.containsKey("SecondParty")) {
    cave.parties.get("SecondParty").index = ...
}

その代わり...

最終的には、これはすべて、達成したいものに依存します...

于 2013-08-27T03:07:26.373 に答える
2

list.indexOf(Object)あなたが説明していることは、正直なところバグを使用することができますMap.

これを試して:

Map<String, Object> mapOfObjects = new HashMap<String, Object>();
mapOfObjects.put("objectName", object);

その後、オブジェクトを取得するときに使用します

mapOfObjects.get("objectName");

あなたが述べたようにオブジェクトの名前を知っていると仮定すると、特にマップに多数のオブジェクトが含まれている場合、これはよりクリーンになり、パフォーマンスが向上します。

オブジェクトを順番に並べる必要がある場合はMap、次を使用できます

Map<String, Object> mapOfObjects = new LinkedHashMap<String, Object>();

代わりは

于 2013-08-27T03:06:47.280 に答える
1

ご質問の要件に応じて、Map が問題を非常に効率的かつ簡単に解決することをお勧めします。

Map では、名前をキーとして、元のオブジェクトを値として指定できます。

  Map<String,Cave> myMap=new HashMap<String,Cave>();
于 2013-08-27T03:07:39.663 に答える
0

クラスの をオーバーライドすることequals(Object)をお勧めしますParty。次のようになります。

public boolean equals(Object o){
    if(o == null)
        return false;
    if(o instanceof String)
        return name.equalsIgnoreCase((String)o);
    else if(o instanceof Party)
        return equals(((Party)o).name);
    return false;
}

その後、indexOf(Object)以下に示すように、メソッドを使用して、名前で指定されたパーティーのインデックスを取得できます。

int index = cave.parties.indexOf("SecondParty");

Partyという名前の のインデックスを返しSecondPartyます。

注: これは、メソッドをオーバーライドしているためにのみ機能しますequals(Object)

于 2013-08-27T03:05:31.960 に答える