Java hashmap问题

1 java hashmap

我想问一下

在Hashmap中

如果元素ID相同,我如何计算所有数字?

谁能给我一些想法?

或者只是给我一些有用的参考链接供我学习

谢谢

import java.util.*;
import java.util.Iterator;

public class hash {

    public static void main(String[] args) {

        HashMap hashMap = new HashMap();
        hashMap.put("ABS", new Double(3434.34));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));

        Set set = hashMap.entrySet();

        Iterator i = set.iterator();
        while (i.hasNext()) {
            Map.Entry me = (Map.Entry) i.next();
            System.out.println(me.getKey() + " : " + me.getValue());
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 5

你不能.您需要一个支持计数键的数据结构.地图实现没有.

番石榴

你可以使用的一件事是GuavaMultimap

示例代码:

final Multimap<String, Double> map =
    Multimaps.newListMultimap(
        Maps.<String, Collection<Double>>newTreeMap(),
        new Supplier<List<Double>>(){

            @Override
            public List<Double> get() {
                return Lists.newArrayList();
            }});
map.put("ABS", Double.valueOf(3434.34));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
for (final Multiset.Entry<String> key : map.keys().entrySet()) {
    System.out.println(
        "Key: "
        +key.getElement()
        +", count: "
        +key.getCount()
        +", values: "
        +map.get(key.getElement())
    );
}
Run Code Online (Sandbox Code Playgroud)

输出:

密钥:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
密钥:ABS,计数:1,值:[3434.34]

Apache Commons/Collections中的MultiMap也可以解决问题.


普通的Java

如果不允许使用外部库,您仍然可以使用a实现此功能Map<String, List<Double>>.创建一个这样的方法

辅助方法

public static <K, V> void assignValue(
    final Map<K, Collection<V>> map, final K key, final V value) {

    Collection<V> values = map.get(key);
    if(values==null){
        values=new ArrayList<V>();
        map.put(key, values);
    }
    values.add(value);
}
Run Code Online (Sandbox Code Playgroud)

用法

并像这样使用它:

final Map<String, Collection<Double>> map =
    new HashMap<String, Collection<Double>>();
assignValue(map, "ABS", Double.valueOf(3434.34));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));

for(final Entry<String, Collection<Double>> entry : map.entrySet()){
    System.out.println(new StringBuilder()
        .append("Key: ")
        .append(entry.getKey())
        .append(", count: ")
        .append(entry.getValue().size())
        .append(", values: ")
        .append(entry.getValue())
        .toString());
}
Run Code Online (Sandbox Code Playgroud)

产量

密钥:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
密钥:ABS,计数:1,值:[3434.34]