我已经发现可以使用另一个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;
}


我在Junit中写东西,这说明我的迭代器有某种错误

java.lang.AssertionError: expected: java.util.EnumMap<{ORIGINAL={ProductC=3.0, ProductA=1.0, ProductB=2.0}}> but was: java.util.EnumMap<{ORIGINAL={ProductC=3.0, ProductA=1.0, ProductB=2.0}}>


我只需要在我的类中使用一个enumMap,并使用测试类enumMap调用该方法进行单元测试。

这是在我的测试类中:TestClassForItems.java
    公共枚举项{
        促销,原始,促销
    }

@Test
public void onRedLinePromotionListOriginalPriceTest() {
    testPromoState = "ORIGINAL";

    testPrices.put("Product_A", 1.00);
    testPrices.put("Product_B", 2.00);
    testPrices.put("Product_C", 3.00);
    expectedPrices = testPrices;
    expectedGoodsMap.put(TestClassForItems.ITEMS.ORIGINAL, testPrices);

    assertSame(expectedGoodsMap, TestClass.getPromotionItems(TestClassForItems.ITEMS.ORIGINAL,testPrices));
}


返回相同的String结果,但由于从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;
}


您已经混淆了数据类型。您正在使用条目作为字符串。如果使用正确的通用值定义数据类型,则会出现编译错误:

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;
}

10-06 16:14