【问题标题】:How do I convert a Map of <String, List<Object>> into a Map of <Object, List<String>>?如何将 <String, List<Object>> 的 Map 转换为 <Object, List<String>> 的 Map?
【发布时间】:2013-08-06 20:32:58
【问题描述】:

问题描述

我正在阅读一本旧的 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)。

答案更新

好的,所以我接受了 James Grammatikos 的建议,效果很好。这是我写的:

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

感谢大家的帮助!

【问题讨论】:

  • Java 之于 Javascript 就像汽车之于地毯。
  • 您应该更改变量名称:哈希映射不保持顺序,排序或其他方式。至于你的问题,不,没有更简单的方法。
  • “我正在考虑用循环遍历原始地图”是的! “如果是”,嗯?试试看。
  • 好吧,我很害怕。感谢您的时间:-)
  • 听起来您可以自己解决问题。完成后,您应该发布您的答案,以便其他人稍后可以找到它! :D

标签: java list sorting map


【解决方案1】:

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

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

【讨论】:

  • 哇,看准了。尽管我想知道,您将 temp 声明为什么?这是一个新列表还是地图条目?
  • 别担心,以为是List&lt;String&gt; ;-)
  • 抱歉,最终没有意外复制这些定义。只是对其进行了编辑以清除问题。
【解决方案2】:

听起来您想将列表分组到地图。您没有提供足够的细节来解决您的特定问题。这是一个通用的实用方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多