我的地图有一些键和值,我想更新下面列出的值。 此数据仅适用于此测试示例。
Map<String, Double> map = new LinkedHashMap<String, Double>();
map.put("s",100.00);
map.put("d",80.00);
map.put("a",80.00);
map.put("e",80.00);
map.put("c", 50.00);
map.put("w", 50.00);
map.put("q", 20.00);
更新后我打印地图应该给我这个: [s = 1,d = 2,a = 2,e = 2,c = 3,w = 3,q = 4] 几乎我会比较值并增加它们。我认为它们是平等的,它保持不变。地图按值排序。 我已将值存储在列表中,并在列表中完成此操作但无法考虑如何使用地图。谢谢!
答案 0 :(得分:0)
不是100%肯定你要求的东西,但也许是这样的:
Map<String, Double> map = new LinkedHashMap<String, Double>();
map.put("s",100.00);
map.put("d",80.00);
map.put("a",80.00);
map.put("e",80.00);
map.put("c", 50.00);
map.put("w", 50.00);
map.put("q", 20.00);
Map<String, Integer> newMap = new LinkedHashMap<>();
double lastVal = -1;
int i = 0;
for (Map.Entry<String, Double> entry : map.entrySet()) {
if (entry.getValue() != lastVal)
i++;
newMap.put(entry.getKey(), i);
lastVal = entry.getValue();
}
System.out.println(newMap);
<强>输出:强>
{s=1, d=2, a=2, e=2, c=3, w=3, q=4}
这是一个稍长但更好,更稳定的解决方案:
public static void main(String[] args) {
Map<String, Double> map = new LinkedHashMap<String, Double>();
map.put("s",100.00);
map.put("d",80.00);
map.put("a",80.00);
map.put("e",80.00);
map.put("c", 50.00);
map.put("w", 50.00);
map.put("q", 20.00);
Map<Double, List<String>> inverted = invertMap(map);
List<Double> keys = new ArrayList<>(inverted.keySet());
Collections.sort(keys, Comparator.reverseOrder());
Map<String, Integer> result = new LinkedHashMap<>();
int i = 1;
for (Double key : keys) {
for (String s : inverted.get(key))
result.put(s, i);
i++;
}
System.out.println(result);
}
static <K, V> Map<V, List<K>> invertMap(Map<K, V> map) {
Map<V, List<K>> result = new HashMap<>();
for (K key : map.keySet()) {
V val = map.get(key);
if (!result.containsKey(val))
result.put(val, new ArrayList<>());
result.get(val).add(key);
}
return result;
}