我有以下数据:
Key value
----- ------
car toyota
car bmw
car honda
fruit apple
fruit banana
computer acer
computer asus
computer ibm
...
(以上数据的每一行都是对象,字段为“key”和“value”,所有这些都在一个列表List<DataObject>
中)
我想将数据构建为Map<String, List<String>>
,如下所示:
"car" : ["toyota", "bmw", "honda"]
"fruit" : ["apple","banana"]
"computer" : ["acer","asus","ibm"]
如何从数据对象中实现上述Map
结构?
的 的 ** * *** 除了的 * ** * **
我更感兴趣的是使用纯JDK提供的类或接口来实现结果,而不是使用外部库。有什么帮助吗?
答案 0 :(得分:11)
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());
}
答案 1 :(得分:9)
我会使用guavas Multimap
实现。但是使用标准的JDK也很容易。
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);
}
输出(两种实现):
{car=[toyota, bmw, honda], fruit=[apple, banana], computer=[acer, asus, ibm]}
答案 2 :(得分:5)
以下代码段将为您提供帮助。
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 );
答案 3 :(得分:3)
迭代对象。对于每个对象,从地图中获取其对应的列表。如果为null,则创建一个新列表并将其放入地图中。然后将值添加到列表中。
或使用Guava's ListMultimap,这将为您完成此操作。
答案 4 :(得分:2)
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"));
答案 5 :(得分:1)
或许这样的事情?
Map<String, List<String>> dataMap = new HashMap<String, List<String>>();
伪代码:
for (String key : keys) {
if (!dataMap.containsKey(key)) {
dataMap.put(key, new ArrayList<String>());
}
dataMap.get(key).add(getValue(key));
}
或者,使用Guava ListMultiMap
。