如何在java中更新map中的值

时间:2014-09-25 16:10:47

标签: java map

我的地图有一些键和值,我想更新下面列出的值。 此数据仅适用于此测试示例。

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] 几乎我会比较值并增加它们。我认为它们是平等的,它保持不变。地图按值排序。 我已将值存储在列表中,并在列表中完成此操作但无法考虑如何使用地图。谢谢!

1 个答案:

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