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?
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());
}
J'utiliserais l'implémentation de goyaves Multimap
. Mais c'est facile à faire avec le 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);
}
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]}
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 );
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.
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"));
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
.