【问题标题】:How to save enum class in a HashMap?如何在 HashMap 中保存枚举类?
【发布时间】:2015-06-28 20:48:20
【问题描述】:

假设我们有以下枚举:

public enum AnimalImages {
TIGER,BEAR,WOLF;
}

public enum CarImages {
BMW,VW,AUDI;
}

现在我想将这些枚举类保存在 HashMap 中:

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

我应该输入什么而不是问号?

【问题讨论】:

  • 您想将给定enum 的所有值存储在一个键后面,或者您想做什么?
  • 一个枚举? …… 最终目的是什么?这是应该由枚举自己处理的事情吗?
  • Mich Mnemonic : 这正是我想要的!
  • @HakanKiyar 你想在枚举映射中存储你所有的枚举作为键和它们的值作为值吗?

标签: java dictionary enums hashmap


【解决方案1】:

要明确回答您的问题,您必须将枚举值设置为:

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

但是,如果您想将所有值放入一个枚举中,那么您可以利用 values() 方法并将您的地图更改为 Map&lt;String,Enum&lt;?&gt;[]&gt; 以便您可以使用它:

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

另一种缩短签名的方法可能是这样的:

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

bali182 在此评论中指出的另一种方式,您可以使用:

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

【讨论】:

  • 为什么不使用Map&lt;String, Collection&lt;? extends Enum&lt;?&gt;&gt;&gt;#put("AnimalImages", Arrays.asList(AnimalImages.values()))?这样我们对类型的了解更多一些?
  • @bali182 是的,它也有效。现已更新。
【解决方案2】:

回答你的问题:

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

但你也可以这样做

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

这样enumMap.get("AnimalImages"),这样你就不必输入检查和强制转换了。

【讨论】:

    【解决方案3】:

    如果要求创建一个包含给定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 是一个专门的Set 实现,在内部表示为位向量。它的唯一目的是提供一种有效且简单的方式来存储enums。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      相关资源
      最近更新 更多