2 回答
TA贡献1871条经验 获得超8个赞
你可以在这里有两种方法:
第一:遍历ArrayList,如果找不到相同的鸟,就把它加入到ArrayList中。这是一种更糟糕的方法。
第二:将鸟类存储在 HashSet 中。在这种情况下,您需要覆盖
.hashCode()
和.equals(Object obj)
方法。这是一个更好的方法。
在说如何生成.hashCode()
和.equals(Object obj)
方法之前,我想提一下.hashCode()
方法和HashSet<T>
。
HashSet<T>
s 提供了一组独特的内部元素。为此,.hashCode()
使用类的方法。如果您重写.hashCode()
任何类中的方法,您可以获得使用 s 的好处HashSet<T>
。如果不重写这个方法,Java 会自动返回对象的内存地址。这就是您HashSet<Bird>
包含重复元素的原因。
.hashCode()
和.equals()
方法可以由许多 IDE 生成。Bird
我将您的课程复制并粘贴到 Eclipse 中。通过用于Alt+Shift+S -> h
Eclipse 或Alt+Insert -> equals() and hashCode()
IntelliJ,自动生成以下方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((latinName == null) ? 0 : latinName.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + obeservation;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Bird other = (Bird) obj;
if (latinName == null) {
if (other.latinName != null)
return false;
} else if (!latinName.equals(other.latinName))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (obeservation != other.obeservation)
return false;
return true;
}
如果您将这些方法(我鼓励您在您的 IDE 中生成)添加到Bird类中,您可以使用HashSet<Bird>. 为避免重复,只需将所有Bird对象添加到 defined 中即可HashSet<Bird>。您不需要任何其他数据结构或相等性检查来控制任何两个Bird类型对象是否相等。
您只需要将您的对象集合从 更改ArrayList<Bird> birds = new ArrayList<Bird>();为Set<Bird> birds = new HashSet<>();。
TA贡献2036条经验 获得超8个赞
add将循环移出:
for (int i = 0; i < birds.size(); i++) {
if (birds.get(i).getName().equals(name1)) {
System.out.println("Bird already exist");
return;
}
}
birds.add(new Bird(name1, latinName1));
添加回答
举报