Donc j'ai ces données

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

cars     honda
cars     lexus
cars     bmw

schools  harvard
schools  yale
...

Et je voudrais construire les données dans un Map<String, Collections<String>> et créer une méthode qui ajoute toutes les données. Jusqu'à présent, j'ai un constructeur qui instancie ma variable 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);
    }
}

Alors quand je lance mon test

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");

Il devrait revenir

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

Mais à la place je reçois

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

Il semble que ce soit seulement l'ajout de la dernière instance parce que chaque fois que j'appelle Collection<String> names = new HashSet<String>(), je ré-instancie names mais quand j'instancie au début de la classe, cela ajoute simplement sur tout. Donc, il renvoie fruit = [apple, banana, grapes, honda, lexus, bmw, hardvard, yale].

0
rlyspooky 20 avril 2017 à 01:44

3 réponses

Meilleure réponse

Pré-Java 8:

Utilisez le fait que Map#get renvoie null lorsqu'il n'y a pas de mappage afin de déterminer si vous devez put une nouvelle collection dans la carte, puis ajoutez la valeur à la collection.

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+:

Utilisez Map#computeIfAbsent pour ajouter une nouvelle collection à la carte s'il n'y a pas de mappage, puis ajoutez la valeur à la collection renvoyée.

public void addkeys(String K, String V) {
    keys.computeIfAbsent(K, k -> new HashSet<>()).add(V);
}
1
4castle 19 avril 2017 à 23:02

Essaye ça

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);
    }
}
0
MigSena 19 avril 2017 à 22:55

Vous pouvez réécrire votre fonction comme ceci:

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
    }
}
0
Iłya Bursov 19 avril 2017 à 22:53