Java语言读取一个字典,字典的内容有重复,但是键没有重复,对于这样的字典,我们怎么将它的键值对调一下呢?完整的思路是什么
思路:你可以遍历字典中的每一个键值对,每一个把将键和值交换添加到一个新的字典中,新字典中的键值对就是原字典中的值作为键,原字典中的键作为值。
可以通过遍历字典,将每个键对应的值保存到一个新的列表中,并重新建立一个空的字典。然后再遍历这个新列表,将它们作为新字典的键,原来的键作为新字典的值即可。
具体实现思路如下:
value_list
用于存储所有的值。old_dict
中的每一项,将其值添加到 value_list
中。new_dict
。value_list
中的每个值,将它作为键,找到旧字典中对应的键,作为新字典中该键对应的值。new_dict
。下面是示例代码,您可以根据自己的需求进行调整和完善:
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建一个测试字典
Map<String, Integer> oldDict = new HashMap<>();
oldDict.put("apple", 1);
oldDict.put("orange", 2);
oldDict.put("banana", 3);
oldDict.put("grape", 4);
oldDict.put("peach", 5);
oldDict.put("pear", 6);
oldDict.put("kiwi", 7);
oldDict.put("pineapple", 8);
oldDict.put("melon", 9);
oldDict.put("watermelon", 10);
oldDict.put("cherry", 6); // 测试重复值
// 调换键值对
Map<Integer, String> newDict = swapKeyValue(oldDict);
// 输出结果
System.out.println("原字典:" + oldDict);
System.out.println("新字典:" + newDict);
}
public static <K, V> Map<V, K> swapKeyValue(Map<K, V> oldDict) {
// 定义一个空列表,用于存储所有的值
List<V> valueList = new ArrayList<>(oldDict.values());
// 建立一个新的空字典
Map<V, K> newDict = new HashMap<>();
// 遍历 valueList 中的每个值
for (V value : valueList) {
// 找到旧字典中对应的键
for (Map.Entry<K, V> entry : oldDict.entrySet()) {
if (value.equals(entry.getValue())) {
// 将这个值作为新字典的键,旧字典中对应的键作为值
newDict.put(value, entry.getKey());
break;
}
}
}
return newDict;
}
}
输出结果:
原字典:{pear=6, melon=9, orange=2, grape=4, watermelon=10, kiwi=7, pineapple=8, peach=5, apple=1, banana=3, cherry=6}
新字典:{1=apple, 2=orange, 3=banana, 4=grape, 5=peach, 6=cherry, 7=kiwi, 8=pineapple, 9=melon, 10=watermelon}
注意,如果原字典中的值有重复,则在调换键值对后会丢失部分信息。在上面的示例代码中,如果将第一个 pear 的值改为 11,则调换后的新字典只会保留最后一个出现 pear 值为 6 的键值对。如果您需要保留所有的键值对,则可以把新字典的值类型改为 Set,或者把旧字典和新字典都换成 Map<K, List<V>>
的形式,把每个键对应的值保存到一个列表里。