java - 如何使用 Java 将值存储为列表而不重复

标签 java arraylist hashmap set

我遇到了使用 java 检索数据的问题。谁能指导我如何找到它的解决方案。

       Map<String,String> map = new HashMap<String,String>();
        map.put("8004","Lead");
        map.put("8004","Opportunity");
        map.put("8004","Quote");
        map.put("8004","Contract");

        map.put("8005","CreatContract" );
        map.put("8005","ManageContract" );
        map.put("8005","SelectContract" );
        //System.out.println(map);

        Iterator<Entry<String, String>> it = map.entrySet().iterator();
        while(it.hasNext()){
             Map.Entry pair = (Map.Entry)it.next();
             //boolean blnExists = map.containsValue(pair.getValue());
             System.out.println(pair.getKey() + " = " + pair.getValue());
        }

输出:

8004 = Contract
8005 = SelectContract

预期输出:

8004 = lead,opportunity,Quote
8005 = CreateContracr,ManageContract

最佳答案

当您在 HashMap 上调用 put 且映射中已存在给定键的条目时,您传递的值将替换 map 上该键的任何内容。所以如果你这样做:

map.put("8004","Lead");
map.put("8004","Opportunity");

那么第二个 put 将覆盖第一个 put 的值。您必须自行检查 map 是否已包含值,如果包含则附加新值。例如,编写一个实用方法:

public void putAppend(Map<String, String> map, String key, String value) {
    if (map.containsKey(key)) {
        map.put(key, map.get(key) + "," + value);
    } else {
        map.put(key, value);
    }
}

然后使用它:

putAppend(map, "8004", "Lead");
putAppend(map, "8004", "Opportunity");

如果您希望该值实际上是一个 List 而不是 String,请适当更改映射:

Map<String, List<String>> map = new HashMap<>();

并使 putAppend 方法如下所示:

public void putAppend(Map<String, List<String>> map, String key, String value) {
    if (!map.containsKey(key)) {
        map.put(key, new ArrayList<>());
    }

    map.put(key, map.get(key).add(value));
}

如果您使用的是 Java 8,则可以使用 computeIfAbsent 和 lambda 表达式:

public void putAppend(Map<String, List<String>> map, String key, String value) {
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}

您还可以使用诸如Google Guava之类的库,其中有 Multimap ,这是一个 Map,可以为一个键保存多个值。

关于java - 如何使用 Java 将值存储为列表而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240078/

相关文章:

java - 帮助弹出菜单

java - 无法实例化类型 Iterator<ArrayList<Integer>>

java - 在javafx中,我如何更改按钮的颜色,等待1秒然后将其更改回默认值?

java - 并发问题和 hashmap

java - 从 hashmap 存储和检索 ArrayList 值

java - 如何将hashmap中的数据从json获取到适配器中?

java - 使用 Java 3.0.0 驱动程序连接到 MongoDB 2.6.3 (eclipse)

java - 删除特定对象在 Java ArrayList 中不起作用

java - 将集合和列表合并到 HashMap

java - 使用迭代器和 ArrayList 的具有 10 个记录的多个 ArrayList