简体   繁体   English

如何在HashMap中保存枚举类?

[英]How to save enum class in a HashMap?

Let us say we have following enums:假设我们有以下枚举:

public enum AnimalImages {
TIGER,BEAR,WOLF;
}

public enum CarImages {
BMW,VW,AUDI;
}

Now I want to save these enum classes in a HashMap:现在我想将这些枚举类保存在 HashMap 中:

Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages",???????);

What I should enter instead of the question marks?我应该输入什么而不是问号?

To explicitly answer to your question, you have to put the enum value as this:要明确回答您的问题,您必须将枚举值设置为:

Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages", AnimalImages.TIGER);

However, if you want to put all the value belonging to an enum, then you could leverage values() method and also change your map to Map<String,Enum<?>[]> so you can use this:但是,如果您想放置属于枚举的所有值,那么您可以利用values()方法并将您的地图更改为Map<String,Enum<?>[]>以便您可以使用:

Map<String,Enum<?>[]> enumMap=new HashMap<String,Enum<?>[]>();  // Note Enum<?>[] array
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());

Another approach, with a shorten signature can be something like this:另一种使用缩短签名的方法可能是这样的:

Map<String, Object> enumMap = new HashMap<String,Object>();
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());

Another way that bali182 pointed in this comment, you could use: bali182在此评论中指出的另一种方式,您可以使用:

Map<String, Collection<? extends Enum<?>>> enumMap = new HashMap<>();
enumMap.put("AnimalImages", Arrays.asList(AnimalImages.values()));
enumMap.put("CarImages", Arrays.asList(AnimalImages.values()));

To answer your question:回答你的问题:

enumMap.put("AnimalImages", AnimalImages.WOLF);
enumMap.put("Cars", CarImages.AUDI);

But you can also do但你也可以这样做

Map<String, AnimalImages> enumMap = new HashMap<String, AnimalImages>();

And this way enumMap.get("AnimalImages") , and this way you won't have to type check and cast it.这样enumMap.get("AnimalImages") ,这样你就不必键入检查并转换它。

If the requirement is to create a Map that contains all values of a given enum , I would use a mapping of String keys into EnumSet values:如果需要创建一个包含给定enum所有值的Map ,我将使用String键到EnumSet值的映射:

Map<String, EnumSet<?>> enumMap = new HashMap<String, EnumSet<?>>();
enumMap.put("AnimalImages", EnumSet.allOf(AnimalImages.class));
enumMap.put("CarImages", EnumSet.allOf(CarImages.class));

for (Map.Entry<String, EnumSet<?>> e : enumMap.entrySet()) {
    System.out.println(String.format("key: [%s], values: %s", 
        e.getKey(), e.getValue().toString()));
}

EnumSet is a specialized Set implementation, which is represented internally as a bit vector. EnumSet是一个专门的Set实现,它在内部表示为一个位向量。 Its sole purpose is to provide an efficient and easy way to store enum s.它的唯一目的是提供一种高效且简单的方法来存储enum

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM