3

これが私のクラスanimals.javaです:

public class animals {
    String Name, ID;
    static ArrayList<animals> animalData = new ArrayList<animals>();

    public animals(){}
    public animals(String name, String id){
        super();
        this.Name = name;
        this.ID = id;
    }

    public void addAnimal(String name, String id){
        animalData.add(new animals(name, id));
    }

    public int search(String name){
        return this.animalData.indexOf(name);
    }
}

動物名に ID を追加すると正常に動作しますが、検索方法を使用すると -1 しか表示されませんでした。多分私はメソッドをオーバーライドするequalsindexof、このクラスで試しますか?これのために私を助けてください

ありがとう、そして私の悪い英語でごめんなさい..

4

5 に答える 5

4

のインスタンスをanimalsリストに追加しています。インスタンスを名前で検索しています。animalDataのインスタンスが含まれていないためStringindexOf()インデックスは返されません。

animals名前でのインスタンスにアクセスする場合は、 を使用する必要がありますMap<String,animals>

Map<String,animals> animalMap = new HashMap<String,animals>();
animalMap.put("Mat", new animals("Mat", "id");
animals animal = animalMap.get("Mat");

の適切な使用法はindexOf()、既にコレクション内にあるインスタンスと等しいインスタンスを渡すことです。他の人が指摘したように、これには、equals()2 つのインスタンスを等しくするものを定義する必要があります。想定される相関関係があるため、オーバーライドhashcode()する場合もオーバーライドする必要があります。equals()

: クラス名には大文字と小文字を使用するのが慣例です。また、クラス名は複数形であってはなりません。の多くのインスタンスがありAnimal、後で のコレクションであるクラスを作成する場合がありますが、それAniamalはメイン クラスの名前であってはなりません。

于 2012-09-02T18:46:10.620 に答える
4

はい、コレクションでオブジェクトを使用し、オブジェクトに基づいてルックアップを実行する場合はequals()、メソッドをオーバーライドする必要があります。hashcode()

indexOf()その特定のインデックスでオブジェクトを返すだけなので、オブジェクトを返します。ただし、オブジェクト ベースのルックアップを行う場合、equals()hashCode()がオーバーライドされていないequals()と、失敗する可能性があり、予期しない結果が得られます。

于 2012-09-02T18:36:57.570 に答える
0

「等しい」メソッドを定義する必要があります

于 2012-09-02T18:40:33.507 に答える
0

使用するコードは次のとおりです。

public class animals {
    String Name, ID;
    static Map<String, animals> animalData = new HashMap<String, animals>();

    public animals(){}
    public animals(String name, String id){
        super();
        this.Name = name;
        this.ID = id;
    }

    public static void addAnimal(String name, String id){
        animalData.add(new animals(name, id));
    }

    // Returns null if no registered animal has this name.
    public animals search(String name){
        return this.animalData.get(name);
    }
}

このようにして、searchメソッドを大幅に高速化 (O(1)) し、メソッドをオーバーライドする必要がなくなりますequals

が static の場合は、 の一種の「セッター」であるため、 staticanimalDataにすることも検討する必要があることに注意してください。addAnimal()aniamalData

于 2012-09-02T18:50:54.620 に答える
0

あなたは文字列を探しています... HashMapを使ったほうがいいと思います...

しかし、そうです、構造を変更する必要があります(これはあまり効率的ではありません)

于 2012-09-02T18:43:39.540 に答える