我有一本旧的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;
}
感谢您的帮助!
答案 0 :(得分:1)
听起来您想将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;
}
答案 1 :(得分: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);
}
}
}