如何将<字符串,列表<Object>>映射转换为<对象,列表<String>>映射?



问题描述

我有一本旧的Java编程课本,我正在复习,但我遇到了一个问题。

我需要转换这个:

Map<String, List<Clock>> timeTableSortedByDestination = 
    new HashMap<String, List<Clock>>();

进入:

Map<Clock, List<String>> timeTableSortedByDepartTime = 
    new HashMap<Clock, List<String>>();

在一种方法中:

static Map<Clock, List<String>> flipMap(Map<String, List<Clock>> originalMap) {
    // implementation
}

我正在考虑使用循环和if来浏览原始Map,但有更平滑或更简单的方法吗?这本书只涉及";源代码";Java(无Javascript)。

应答更新

好吧,所以我采纳了詹姆斯·格拉马蒂科斯的建议,效果很好。这是我写的:

static Map<Clock, List<String>> flipMap(Map<String, List<Clock>> originalMap) {
    Map<Clock, List<String>> newMap = new HashMap<Clock, List<String>>();
    for(String s : originalMap.keySet()) {
       for(Clock c : originalMap.get(s)) {
           newMap.put(c, new ArrayList<String>());
           }
       }
    for(Clock c : newMap.keySet()) {
        for(String s : originalMap.keySet()) {
            if(originalMap.get(s).contains(c)) {
                List<String> temp = newMap.get(c);
                temp.add(s);
                newMap.put(c, temp);
            }
        }
    }
    return newMap;
}

谢谢你的帮助!

只需遍历所有时钟,以时钟为键构建一个新的映射,然后再次遍历原始映射。我在这里用对象替换了时钟,因为我太懒了,无法定义时钟类

Map<String,List<Object>> timeTableSortedByDestination = new HashMap<String,List<Object>>();
Map<Object,List<String>> timeTableSortedByDepartTime = new HashMap<Object,List<String>>();
List<String> temp;    
// dump all of the objects into the new map
for(String s : timeTableSortedByDestination.keySet()){
    for(Object o : timeTableSortedByDestination.get(s)){
        timeTableSortedByDepartTime.put(o, new ArrayList<String>());
    }
}
//iterating through each list in the original map
for(Object o : timeTableSortedByDepartTime.keySet()){
    for(String s : timeTableSortedByDestination.keySet()){
        // if the object was in that list
        if(timeTableSortedByDestination.get(s).contains(o)){
            temp = timeTableSortedByDepartTime.get(o);
            temp.add(s);
            // add the corresponding string to the list in the new map
            timeTableSortedByDepartTime.put(o, temp);
        }
    }
}

听起来像是要将List分组为Map。你没有提供足够的细节来解决你的特定问题。这里有一个通用的实用方法:

public interface GroupingExpression<T, U> {
    T groupBy(U item);
}
public static <T, U> Map<T, List<U>> group(List<U> list, GroupingExpression<T, U> groupingExpression) {
    Map<T, List<U>> groupedMap = new LinkedHashMap<T, List<U>>();
    for(U item : list) {
        T key = groupingExpression.groupBy(item);
        List<U> keyedList = groupedMap.get(key);
        if(keyedList == null) {
            keyedList = new ArrayList<U>();
            groupedMap.put(key, keyedList);
        }
        keyedList.add(item);
    }
    return groupedMap;
}

最新更新