Java 从HashMap初始化EnumMap

Java 从HashMap初始化EnumMap,java,junit,Java,Junit,我发现可以使用另一个HashMap的值初始化java EnumMap,但这是通过测试实现的。我不需要使用有效的双括号或类似的东西,我只需要从给定的贴图创建贴图 public EnumMap<ITEMS, Map<String, Double>> getPromotionItems(String state, Map<String, Double> prices) { EnumMap<ITEMS, Map<String, Double>

我发现可以使用另一个HashMap的值初始化java EnumMap,但这是通过测试实现的。我不需要使用有效的双括号或类似的东西,我只需要从给定的贴图创建贴图

public EnumMap<ITEMS, Map<String, Double>> getPromotionItems(String state, Map<String, Double> prices) {
    EnumMap<ITEMS, Map<String, Double>> promoItems = new EnumMap<>(ITEMS.class);
    Iterator iterator = prices.entrySet().iterator();
    Iterator keys = prices.keySet().iterator();

    HashMap map = new HashMap<String, Double>();
    while(keys.hasNext()) {
        map.put(iterator.next(),keys.next());
    }
    promoItems.put(ITEMS.valueOf(state),map);
    return promoItems;
}
返回相同的字符串结果,但由于从main实例化运行我的Junit测试所需的所有属性,因此对象用法不同。

一个简短的解决方案:

public EnumMap<ITEMS, Map<String, Double>> getPromotionItems(String state, Map<String, Double> prices) {
    EnumMap<ITEMS, Map<String, Double>> promoItems = new EnumMap<>(ITEMS.class);
    promoItems.put(ITEMS.valueOf(state), new HashMap<>(prices));
    return promoItems;
}
公共EnumMap getPromotionItems(字符串状态,映射价格){ EnumMap promoItems=新的EnumMap(ITEMS.class); promotItems.put(ITEMS.valueOf(state),新的HashMap(prices)); 退货项目; } 您混淆了数据类型。您正在将条目用作字符串。如果使用正确的泛型值定义数据类型,将出现编译错误:

public EnumMap<ITEMS, Map<String, Double>> getPromotionItems(String state, Map<String, Double> prices) {
    EnumMap<ITEMS, Map<String, Double>> promoItems = new EnumMap<>(ITEMS.class);
    Iterator<Entry<String, Double>> iterator = prices.entrySet().iterator();
    Iterator<String> keys = prices.keySet().iterator();

    HashMap<String, Double> map = new HashMap<String, Double>();
    while (keys.hasNext()) {
        map.put(iterator.next(), keys.next());
    }
    promoItems.put(ITEMS.valueOf(state), map);
    return promoItems;
}
公共EnumMap getPromotionItems(字符串状态,映射价格){ EnumMap promoItems=新的EnumMap(ITEMS.class); 迭代器迭代器=prices.entrySet().Iterator(); 迭代器键=prices.keySet().Iterator(); HashMap=newHashMap(); while(keys.hasNext()){ put(iterator.next(),keys.next()); } promotItems.put(ITEMS.valueOf(state),map); 退货项目; } 更改:

assertSame
致:


assertSame()
=
相同,而
assertEquals()
进行
equals()
比较。

不要使用原始类型。@shmosel现在尝试编译时进行了编辑,看看您的想法。我不确定您更改了什么,但
迭代器
映射
都使用原始类型;显然,您不希望使用可用的
EnumMap
copy构造函数,但这似乎是在子映射中出现键冲突时随机选取最终值。您不应该在此处发布测试代码吗?编辑仍然提供了我得到的结果。再次尝试运行它@David Perez Cabrererez Cabrera这个解决方案是我开始使用的,但问题是JUnit。这些结果不应该显示断言Error.Perez Cabrera我将测试与我正在使用的枚举映射一起添加,以便您可以看到断言是什么。我还使用.equals()对“AssertSame”和“AssertTrue”进行了尝试,得到了相同的结果。@April\u Nara您必须将AssertSame更改为assertEquals,正如Bohemian所说。equals似乎是我正在寻找的对象比较,正如您所看到的,上面的结果对这两个对象都完全相同。断言错误的预期结果和实际结果如何相同?
assertSame
assertEquals