簡體   English   中英

具有唯一鍵字符串的用戶定義類型的 Java 集合集

[英]Java collection set for user defined types with unique key strings

我想知道是否有一個可以用於類 Weapon 的集合,它就像一個武器對象的 hash_set,但我想在我的武器類中使用一個名稱字段並使其不存在兩個具有相同名稱的武器在集合中。 我想將輸入與我的 Weapon 集的字符串進行比較,以查看它是否已經存在,如果存在,請不要將其放入集合中,但我不想每次都搜索整個地圖。 此外,它不會區分大小寫。

在您的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");
    }
}

我們必須覆蓋 equals() 和 hashcode() 方法以返回相同的 name 整數。

下面是 equals() 和 hashcode() 合約:

參見 java.lang.Object 的 JavaDoc

在 hashCode() 中它說:

如果根據 equals(Object) 方法兩個對象相等,則對這兩個對象中的每一個調用 hashCode 方法必須產生相同的整數結果。

如果你只覆蓋 equals() 而不是 hashCode() 你的類違反了這個契約。

這在equals()方法的JavaDoc中也有說:

請注意,每當重寫此方法時,通常都需要重寫 hashCode 方法,以維護 hashCode 方法的一般約定,即相等的對象必須具有相等的哈希碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM