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

siv3szwd  于 11个月前  发布在  Java
关注(0)|答案(4)|浏览(211)

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

task_1 => [date1, date2, date3, date5]
task_2 => [date4, date5]
task_3 => [date2, date3, date5]
task_4 => [date4, date5]

字符串
当它被逆转时,

date1 => [task_1]
date2 => [task_1, task_3]
date3 => [task_1, task_3]
date4 => [task_2, task_4]
date5 => [task_1, task_2, task_3, task_4]


代码

public static void main(String[] args) {
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> t1List = new ArrayList<String>();
    t1List.add("date1");
    t1List.add("date2");
    t1List.add("date3");
    t1List.add("date5");
    ArrayList<String> t2List = new ArrayList<String>();
    t2List.add("date4");
    t2List.add("date5");
    ArrayList<String> t3List = new ArrayList<String>();
    t3List.add("date2");
    t3List.add("date3");
    t3List.add("date5");
    ArrayList<String> t4List = new ArrayList<String>();
    t4List.add("date4");
    t4List.add("date5");
    myMap.put("task_1", t1List);
    myMap.put("task_2", t2List);
    myMap.put("task_3", t3List);
    myMap.put("task_4", t4List);
    
    Map<String, ArrayList<String>> reversedMap = Test.getReversedMap(myMap);
}

f4t66c6m

f4t66c6m1#

只需执行它:

Map<String, ArrayList<String>> getReversedMap(Map<String, ArrayList<String>> myMap){
      Map<String, ArrayList<String>> result = new HashMap<>();
      for(String key : myMap.keySet()){
          for(String val : myMap.get(key)){
              if(!result.containsKey(val)){
                  result.put(val, new ArrayList());
              }
              result.get(val).add(key);
          }
      }
      return result;
}

字符串

fquxozlt

fquxozlt2#

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

fsi0uk1n

fsi0uk1n3#

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

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

字符串

dwthyt8l

dwthyt8l4#

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

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

字符串

分步分解

1.将Map转换为条目流

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

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

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

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

// Map<String, List<String>>
.collect(Collectors.groupingBy(
        Map.Entry::getValue,
        Collectors.mapping(Map.Entry::getKey, Collectors.toList())));

相关问题