如何将两个枚举作为键和值添加到单个Map对象

时间:2016-12-13 15:28:32

标签: java enums

我有两个枚举。我想从两个枚举中创建一个Map对象。

我已经通过了EnumMap,但它说只有密钥可以是枚举。如果我错了,请纠正我。

private enum Export {
    BINGOEXPORT, DEFECTSEXPORT, IBC3EXPORT, IBCONTRACTSEXPORT, 
    RMAHEADEREXPORT, RMALINESEXPORT, SITESEXPORT, SREXPORT
};

private enum Preperation {
    BINGOPREPERATION, DEFECTSPREPERATION, IBC3PREPERATION, 
    IBCONTRACTSPREPERATION, RMAHEADERPREPERATION, RMALINESPREPERATION, 
    SITESPREPERATION, SRPREPERATION, IBEXPORTLOGPREPERATION
};

3 个答案:

答案 0 :(得分:3)

普通的HashMap可以将枚举作为键和值。

Map<Export, Preparation> myMap = new HashMap<>();
myMap.put(Export.BINGOEXPORT, Preparation.BINGOPREPERATION);

答案 1 :(得分:2)

如果您想使用一个enum作为键,另一个作为值,EnumMap允许您这样做(demo):

EnumMap<Export,Preparation> e2p = new EnumMap<Export,Preparation>(Export.class);
e2p.put(Export.RMALINESEXPORT, Preparation.SRPREPERATION);
System.out.println(e2p.get(Export.RMALINESEXPORT));

如果您希望将enum混合为同一Map的密钥,则一种方法是为两个enum创建一个公共接口,并将其用作密钥为Map输入。您可以这样做,因为允许Java enum扩展类并实现接口:

private interface CommonKey {
    int hashCode();
    boolean equals(Object other);
}

private enum Export implements CommonKey {
    BINGOEXPORT, DEFECTSEXPORT, IBC3EXPORT, IBCONTRACTSEXPORT, RMAHEADEREXPORT, RMALINESEXPORT, SITESEXPORT, SREXPORT
}

private enum Preperation implements CommonKey {
    BINGOPREPERATION, DEFECTSPREPERATION, IBC3PREPERATION, IBCONTRACTSPREPERATION, RMAHEADERPREPERATION, RMALINESPREPERATION, SITESPREPERATION, SRPREPERATION, IBEXPORTLOGPREPERATION
}

现在您可以声明您的地图:

Map<CommonKey,SomeClass> myMap = new HashMap<>();
myMap.put(Export.BINGOEXPORT, someObject);
myMap.put(Preperation.RMAHEADERPREPERATION, antherObject);

两种接口方法都是可选的,因为它们是从java.lang.Object继承的。无论如何,我将它们添加到界面中,以便读者更容易理解实现类的哪些部分对于您使用界面非常重要。

答案 2 :(得分:0)

您可以尝试制作两个实现相同界面的枚举