迭代字符串映射和不固定值的整数列表

Iterate Map of String and List of integer with not fixed values

我有一个字符串和列表映射counts.I想要迭代它并想在对象中设置映射值。

    counts.put("ABC", Arrays.asList(1,2,3));
    counts.put("XYZ", Arrays.asList(1,2));
    counts.put("PQR", Arrays.asList(1));
    counts.put("IJK", Arrays.asList());

map值是list类型,可以是1,2,3等,也可以是空但不会超过3,short size不能超过2

我写了如下代码:

for (Map.Entry<String,List<Integer>> count : counts.entrySet()) {
        InventoryOwnerManagerResult result = new InventoryOwnerManagerResult();
        InventoryOwnerPresence  presence = new InventoryOwnerPresence();
        switch (count.getValue().size()) {
            case 1:
                presence.setConfigCount(count.getValue().get(0));
                presence.setWebsitesCount(0);
                presence.setSourcesCount(0);
                break;
            case 2:
                presence.setConfigCount(count.getValue().get(0));
                presence.setWebsitesCount(count.getValue().get(1));
                presence.setSourcesCount(0);
                break;
            case 3:
                presence.setConfigCount(count.getValue().get(0));
                presence.setWebsitesCount(count.getValue().get(1));
                presence.setSourcesCount(count.getValue().get(2));
                break;
            default:
                presence.setConfigCount(0);
                presence.setWebsitesCount(0);
                presence.setSourcesCount(0);
                break;
        }
         result.setInventoryOwnerPresence(presence);
    }

这是非常老派的做法,也不合适。

还有其他方法吗?

您可以将开关替换为以下内容:

List<Integer> counts = count.getValue();
presence.setConfigCount(counts.size() > 0 ? counts.get(0) : 0);
presence.setWebsiteCount(counts.size() > 1 ? counts.get(1) : 0);
presence.setSourcesCount(counts.size() > 2 ? counts.get(2) : 0);

如果 numbers 有超过 3 个元素,这将有不同的表现;此解决方案仅丢弃第 4 个及以后的元素,您的解决方案将丢弃所有元素。但这并不重要,因为您永远不会获得超过 3 个元素。

您选择哪个选项是个人喜好。开关清晰但冗长,三元表达式简洁但对某些人来说可能有点难以阅读。就性能而言,switch 的性能可能更好,但我怀疑您是否真的看到了差异。