编写一个方法来在Map

时间:2017-04-19 22:44:41

标签: java dictionary

所以我有这个数据

Key      Value
---      -----
fruit    apple
fruit    banana
fruit    grapes

cars     honda
cars     lexus
cars     bmw

schools  harvard
schools  yale
...

我想将数据构建到Map<String, Collections<String>>并创建一个添加所有数据的方法。到目前为止,我有一个构造函数来实例化我的Map变量

public Map<String, Collection<String>> keys;

public newMap() {
    keys = new HashMap<>();
}

public void addkeys(String K, String V) {
    Collection<String> names = new HashSet<String>();

    if (keys.containsKey(K) && !keys.values().contains(V)) {
        names.add(V);
        courses.put(K, names);

    } else if (!keys.containsKey(K) && !keys.values().contains(V)) {
        names.add(V);
        courses.put(student, classes);
    }
}

所以当我运行我的测试时

newMap.addkeys("fruit", "apple");
newMap.addkeys("fruit, "banana");
newMap.addkeys("fruit", "grapes");
newMap.addkeys("cars, "honda");
newMap.addkeys("cars", "lexus");
newMap.addkeys("cars, "bmw");
newMap.addkeys("schools", "harvard");
newMap.addkeys("schools, "yale");

它应该返回

fruit = [apple, banana, grapes] 
cars = [honda, lexus, bmw]
schools = [hardvard, yale]

但我得到了

fruit = [grapes]
cars = [bmw]
schools = [yale]

似乎它只是添加了最后一个实例,因为每当我调用Collection<String> names = new HashSet<String>()时,我都在重新实例化names但是当我实例化到类的begininng时,它只是添加了所有内容。所以它返回fruit = [apple, banana, grapes, honda, lexus, bmw, hardvard, yale]

3 个答案:

答案 0 :(得分:1)

Pre-Java 8:

使用Map#get在没有映射时返回null的事实,以确定您是否需要put地图中的新集合,然后将值添加到集合。

public void addkeys(String K, String V) {
    Collection<String> values = keys.get(K);
    if (values == null) {
        values = new HashSet<>();
        keys.put(K, values);
    }
    values.add(V);
}

Java 8 +:

如果没有映射,请使用Map#computeIfAbsent向地图添加新集合,然后将值添加到返回的集合中。

public void addkeys(String K, String V) {
    keys.computeIfAbsent(K, k -> new HashSet<>()).add(V);
}

答案 1 :(得分:0)

您可以像这样重写您的功能:

public void addkeys(String K, String V) {
    if (keys.containsKey(K)) {
        keys.get(K).add(V); // add to existing hashset
    } else {
        Collection<String> names = new HashSet<String>();
        names.add(V);
        keys.put(K, names); // add new hashset for key
    }
}

答案 2 :(得分:0)

试试这个

public Map<String, Set<String>> myMap;

public newMap() {
    myMap = new HashMap<>();
}

public void putInMap(String key, String val) {

    if (myMap.containsKey(key)) {
        myMap.get(K).add(V);
    } else {
        Set<String> values = new HashSet<String>();
        values.add(val);
        myMap.put(key, values);
    }
}