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));
添加回答
舉報