簡體   English   中英

Java:Enum子集元素的哈希圖

[英]Java: Hashmap of Enum subset elements

我在Java中有一個很大的枚舉,我想將其分解為子集(我認為我可以使用EnumSet做到這一點)。 然后,我希望能夠創建EnumSet中的元素的哈希圖或枚舉圖。 請問我該如何實現?

public enum Test { ENUM1, ENUM2, ENUM3, ENUM4, ENUM5 }

EnumSet<Test> testSet = EnumSet.range(ENUM2, ENUM4);

HashMap<testSet, String> testHashMap;        <--- Compilation Failure

編輯: 我希望能夠創建哈希集,使其僅具有EnumSet的可用枚舉的鍵,並為EnumSet中的每個枚舉分配一個唯一的字符串值。

謝謝!

testSetEnumSet的實例。 您想將鍵類型定義為EnumSet<Test>

HashMap<EnumSet<Test>, String> testHashMap = new HashMap<>();
...
testHashMap.put(testSet, "string");

聽起來您想要的是HashMap<Test, String> ,您將不得不自己將限制強制到指定范圍。 您無法在Java的類型系統級別對該限制進行編碼。

我不認為您可以像示例中那樣進行編譯時檢查-除非您實際上將枚舉拆分為多個較小的枚舉。 在運行時,有一些選項。

如果可能的話,我將創建地圖 EnumMap<Test, String>不可修改視圖 這實際上將映射鍵限制為您選擇的任何Enum常量。

實際地圖仍然可變。 如果需要在您的控制下更改字符串,則可以在內部進行操作,但只能將不可變的映射公開。 如果每個人都需要更改字符串,則可以使用諸如不可修改的EnumMap<Test, StringHolder>類的東西EnumMap<Test, StringHolder>並用所需的枚舉范圍和空的持有者預先填充它( StringHolder是一個簡單的pogo,帶有getter和setter表示單個字符串值(類似於可變字符串)。

另一個選擇是您自己的地圖類型(由HashMapEnumMap )。 每當創建新密鑰時,請檢查testSet並在該密鑰不在其中時引發異常。

不幸的是,您將不得不擴展HashMap 每次添加元素時,都必須對照EnumSet進行檢查。

public class EnumSetMap<E, V> extends HashMap<E, V> implements Map<E, V> {
    private EnumSet<E> allowed;

    public EnumSetMap(EnumSet<E> allowed) {
        this.allowed = allowed;
    }

    @Override
    public V put(E key, V value) {
        if (allowed.contains(element))
            throw new IllegalArgumentException("Key must be in the Enum set.");
        return super.put(E, V);
    }
}

您的示例代碼將變為:

HashMap<Test, String> = new EnumSetMap<Test, String>(testSet);

暫無
暫無

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

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