web-dev-qa-db-fra.com

Comment réaliser cette structure Map <String, List <>>

J'ai des données comme ci-dessous:

 Key       value
-----      ------
car         toyota
car         bmw
car         honda

fruit       Apple
fruit       banana

computer    Acer
computer    asus
computer    ibm 
...

(Chaque ligne de données ci-dessus est un objet avec les champs "clé" et "valeur", le tout dans une seule liste List<DataObject>)

Je voudrais construire les données en Map<String, List<String>> comme suit:

 "car"      : ["toyota", "bmw", "honda"]
 "fruit"    : ["Apple","banana"]
 "computer" : ["Acer","asus","ibm"]

Comment obtenir une structure Map supérieure à partir des objets de données?

** * *** En plus * ** * **

Je suis plus intéressé par l'utilisation de classes ou d'interfaces fournies uniquement par JDK pour obtenir le résultat au lieu d'utiliser une bibliothèque externe. De l'aide?

11
Mellon
    Map<String, List<String>> myMaps = new HashMap<String, List<String>>();
    for (DataObject item : myList) {
        if (!myMaps.containsKey(item.getKey())) {
            myMaps.put(item.getKey(), new ArrayList<String>());
        }
        myMaps.get(item.getKey()).add(item.getValue());
    }
16
rius

J'utiliserais l'implémentation de goyaves Multimap. Mais c'est facile à faire avec le JDK standard.

Exemple de JDK standard:

public static void main(String[] args) {
    Scanner s = new Scanner(
            "car         toyota\n" +
            "car         bmw\n" +
            "car         honda\n" +
            "fruit       Apple\n" +
            "fruit       banana\n" +
            "computer    Acer\n" +
            "computer    asus\n" +
            "computer    ibm");

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

    while (s.hasNext()) {

        String key = s.next();
        if (!map.containsKey(key))
            map.put(key, new LinkedList<String>());

        map.get(key).add(s.next());
    }

    System.out.println(map);
}

Exemple de goyave:

public static void main(String[] args) {
    Scanner s = new Scanner(
            "car         toyota\n" +
            "car         bmw\n" +
            "car         honda\n" +
            "fruit       Apple\n" +
            "fruit       banana\n" +
            "computer    Acer\n" +
            "computer    asus\n" +
            "computer    ibm");

    Multimap<String, String> map = LinkedListMultimap.create();

    while (s.hasNext()) 
        map.put(s.next(), s.next());

    System.out.println(map);
}

Sortie (les deux implémentations):

{car=[toyota, bmw, honda], fruit=[Apple, banana], computer=[Acer, asus, ibm]}
9
dacwe

L'extrait ci-dessous vous aidera.

        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

        ArrayList<String> carList = new ArrayList<String>();
        carList.add("toyota");
        carList.add("bmw");
        carList.add("honda");

        map.put("car", carList);

        ArrayList<String> fruitList = new ArrayList<String>();
        fruitList .add("Apple");
        fruitList .add("banana");

        map.put("fruit", fruitList );
5
Vipul Shah

Itérer sur les objets. Pour chaque objet, obtenez sa liste correspondante sur la carte. Si null, créez une nouvelle liste et mettez-la dans la carte. Ajoutez ensuite la valeur à la liste.

Ou utilisez ListMultimap de Guava , qui le fera pour vous.

3
JB Nizet
Map<String, List<String>> data = new HashMap<String, List<String>>();
data.put("car", Arrays.asList("toyota", "bmw", "honda"));
data.put("fruit", Arrays.asList("Apple","banana"));
data.put("computer", Arrays.asList("Acer","asus","ibm"));
1
scarba05

Quelque chose comme ça peut-être?

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

Pseudocode:

for (String key : keys) {
    if (!dataMap.containsKey(key)) {
        dataMap.put(key, new ArrayList<String>());
    }

    dataMap.get(key).add(getValue(key));
}

Sinon, utilisez Guava ListMultiMap .

1
Buhake Sindi