如何实现此Map >结构[关闭]

问题描述 投票:11回答:6
我有如下数据:

Key value ----- ------ car toyota car bmw car honda fruit apple fruit banana computer acer computer asus computer ibm ...

(以上数据的每一行都是一个带有字段“键”和“值”的

对象,全部在一个列表List<DataObject>中]

我想将数据构造为Map<String, List<String>>,如下所示:

"car" : ["toyota", "bmw", "honda"] "fruit" : ["apple","banana"] "computer" : ["acer","asus","ibm"]

如何从数据对象实现以上Map结构?

[ ** * *** 其他 * ** * **

我对使用纯JDK提供的类或接口来实现结果而不是使用外部库更感兴趣。有帮助吗?
java data-structures multimap multi-mapping
6个回答
18
投票
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()); }

9
投票
我将使用番石榴Multimap实现。但是使用标准的JDK也是容易做到的。

示例标准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]}


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
投票
迭代对象。对于每个对象,从地图上获取其对应的列表。如果为null,则创建一个新列表并将其放入地图中。然后将值添加到列表中。

或使用Guava's ListMultimap,它将为您完成此操作。


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

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

或者,使用番石榴ListMultiMap
© www.soinside.com 2019 - 2024. All rights reserved.