如何在java中创建反向映射?

时间:2015-01-12 06:26:04

标签: java java-7

我有"task(s)": ["epochdate1", "epochdate2"]的地图如何反转此地图?

例如

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) {
    // TODO Auto-generated method stub
    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);
}

3 个答案:

答案 0 :(得分:3)

实施它:

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

答案 1 :(得分:0)

没有捷径。您必须迭代原始映射的entrySet,并且对于您找到的每个日期值,将新条目放在新映射中,并将匹配任务作为第一个值,或者将任务添加到现有条目的列表中(如果日期已经在新地图中。

答案 2 :(得分:0)

我会使用番石榴。尝试类似:

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