Java arraylist indexof

时间:2012-09-02 18:35:37

标签: java arraylist indexing

这是我的班级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?帮我这个

谢谢你,抱歉我的英文不好......

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

您正在将animals的实例添加到列表中。您正在按名称搜索实例。由于animalData不包含String的任何实例,indexOf()将永远不会返回索引。

如果您想通过名称访问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(),因为存在假定的相关性。

注意:惯例是使用CapitalCase作为类名。此外,班级名称不应为复数。您将拥有许多Animal个实例,稍后您可以创建一个类Aniamal的集合,但这不应该是主类的名称。

答案 2 :(得分:0)

您需要定义“等于”方法

答案 3 :(得分:0)

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

但是,你必须改变你的结构(效率不高)

答案 4 :(得分: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的'setter'。