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

是的,当您在集合中使用对象并执行基于对象的查找时,您需要重写equals()和方法。hashcode()

indexOf()返回对象,因为它只返回该特定索引处的对象。但是,当您进行基于对象的查找时,如果 equals() 并且hashCode()未被覆盖,equals()则可能会失败并且您会得到不可预测的结果。

于 2012-09-02T18:36:57.570 回答
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()以定义使两个实例相等的原因。您还应该在覆盖hashcode()时覆盖equals(),因为存在假定的相关性。

注意:约定是使用大写字母作为类名。此外,类名不应该是复数。您将有许多 s 的实例Animal,稍后您可能会创建一个作为 s 集合的类Aniamal,但这不应该是主类的名称。

于 2012-09-02T18:46:10.620 回答
0

您需要定义一个“等于”方法

于 2012-09-02T18:40:33.507 回答
0

您正在寻找一个字符串...我认为您最好使用 HashMap...

但是是的,你必须改变你的结构(这不是很有效)

于 2012-09-02T18:43:39.540 回答
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方法。

请注意,如果animalData是静态的,您也应该考虑将其设为addAnimal()静态,因为它有点像aniamalData.

于 2012-09-02T18:50:54.620 回答