我想知道是否有一个集合可以用于武器类,就像武器对象的hash_set一样,但是我想在我的武器类中使用一个名称字段,并使其不具有相同的两个武器名称可以存在于集合中。我想将输入与我的武器组的字符串进行比较,以查看是否已经存在,如果不存在,则不要将其放入组中,但是我不想每次都搜索整个地图。另外,它也不区分大小写。
答案 0 :(得分:3)
在您的equals()
中,仅检查name
字段是否相等。
public class Weapon {
private String name;
// ... other fields
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Weapon weapon = (Weapon) o;
return name.equalsIgnoreCase(weapon.name); //case-insensitive
}
@Override
public int hashCode() {
return name.toLowerCase().hashCode();
}
}
然后像这样使用HashSet:-
public static void main(String[] args) {
Set<Weapon> weapons = new HashSet<>();
Weapon w1 = new Weapon();
// TODO set the name of the weapon or pass it in constructor
if (weapons.add(w1)) {
System.out.println("Weapon added");
} else {
System.out.println("Weapon with same name already exists");
}
}
答案 1 :(得分:1)
我们必须重写equals()和hashcode()方法以返回相同的整数名称。
下面是equals()和hashcode()合约:
请参阅java.lang.Object的JavaDoc
在hashCode()中表示:
如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
如果仅覆盖equals()而不是hashCode(),则您的类违反了此合同。
equals()方法的JavaDoc中也提到了这一点:
请注意,通常每当重写此方法时,都必须重写hashCode方法,以维护hashCode方法的常规协定,该协定规定相等的对象必须具有相等的哈希码。