如何在Java中反转Map&lt;String,ArrayList< String>&gt;?

siv3szwd  于 2024-01-05  发布在  Java
关注(0)|答案(4)|浏览(285)

我有一张"task(s)": ["epochdate1", "epochdate2"]的Map,我如何反转(invert)这张Map?
例如

  1. task_1 => [date1, date2, date3, date5]
  2. task_2 => [date4, date5]
  3. task_3 => [date2, date3, date5]
  4. task_4 => [date4, date5]

字符串
当它被逆转时,

  1. date1 => [task_1]
  2. date2 => [task_1, task_3]
  3. date3 => [task_1, task_3]
  4. date4 => [task_2, task_4]
  5. date5 => [task_1, task_2, task_3, task_4]


代码

  1. public static void main(String[] args) {
  2. Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
  3. ArrayList<String> t1List = new ArrayList<String>();
  4. t1List.add("date1");
  5. t1List.add("date2");
  6. t1List.add("date3");
  7. t1List.add("date5");
  8. ArrayList<String> t2List = new ArrayList<String>();
  9. t2List.add("date4");
  10. t2List.add("date5");
  11. ArrayList<String> t3List = new ArrayList<String>();
  12. t3List.add("date2");
  13. t3List.add("date3");
  14. t3List.add("date5");
  15. ArrayList<String> t4List = new ArrayList<String>();
  16. t4List.add("date4");
  17. t4List.add("date5");
  18. myMap.put("task_1", t1List);
  19. myMap.put("task_2", t2List);
  20. myMap.put("task_3", t3List);
  21. myMap.put("task_4", t4List);
  22. Map<String, ArrayList<String>> reversedMap = Test.getReversedMap(myMap);
  23. }

f4t66c6m

f4t66c6m1#

只需执行它:

  1. Map<String, ArrayList<String>> getReversedMap(Map<String, ArrayList<String>> myMap){
  2. Map<String, ArrayList<String>> result = new HashMap<>();
  3. for(String key : myMap.keySet()){
  4. for(String val : myMap.get(key)){
  5. if(!result.containsKey(val)){
  6. result.put(val, new ArrayList());
  7. }
  8. result.get(val).add(key);
  9. }
  10. }
  11. return result;
  12. }

字符串

fquxozlt

fquxozlt2#

没有捷径可走,你必须遍历原始Map的entrySet,对于你找到的每个日期值,在新Map中放置一个新条目,匹配的任务作为第一个值,或者如果日期已经在新Map中,则将任务添加到现有条目的列表中。

fsi0uk1n

fsi0uk1n3#

我会用Guava来做这个。试试这样的:

  1. Map<K, V> map = ...;
  2. ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map),
  3. ArrayListMultimap.<V,K>create());

字符串

dwthyt8l

dwthyt8l4#

下面是Java 8+中使用流的解决方案:

  1. Map<String, List<String>> invertedMap = myMap.entrySet().stream()
  2. .flatMap(e -> e.getValue().stream()
  3. .map(v -> Map.entry(e.getKey(), v)))
  4. .collect(Collectors.groupingBy(
  5. Map.Entry::getValue,
  6. Collectors.mapping(Map.Entry::getKey, Collectors.toList())));

字符串

分步分解

1.将Map转换为条目流

  1. // Stream<Map.Entry<String, ArrayList<String>>>
  2. myMap.entrySet().stream()

1.将每个条目拆分为值列表

  1. // Stream<Map.Entry<String, String>>
  2. .flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))

中的每个项目的单独项目
1.将这些条目分组到一个新的Map中,其中键等于以前的值,值包含Map到该值的每个原始键的列表。

  1. // Map<String, List<String>>
  2. .collect(Collectors.groupingBy(
  3. Map.Entry::getValue,
  4. Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
展开查看全部

相关问题