簡體   English   中英

如何轉換的地圖 <String, List<Object> &gt;進入 <Object, List<String> &gt;?

[英]How do I convert a Map of <String, List<Object>> into a Map of <Object, List<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)進行交易。

答案更新

好的,所以我接受了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;
}

感謝您的所有幫助!

聽起來您想將列表分組到地圖。 您尚未提供足夠的詳細信息來解決您的特定問題。 這是一個通用的實用程序方法:

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

只需遍歷所有時鍾,以時鍾為鍵構建新的映射,然后再次遍歷原始映射。 我在這里用對象替換時鍾,因為我懶得定義時鍾類

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM