所以我有这个数据
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]
。
答案 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);
}
}