这是我的班级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。也许我在这个课程中尝试覆盖方法equals
或indexof
?帮我这个
谢谢你,抱歉我的英文不好......
答案 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'。