Java hashmap问题

时间:2011-02-02 06:20:01

标签: 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());
        }


    }
}

5 个答案:

答案 0 :(得分: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())
    );
}

<强>输出:

  

键:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
  关键:ABS,计数:1,值:[3434.34]

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


Plain Java

如果您不允许使用外部库,您仍然可以使用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);
}

<强>用法

并像这样使用它:

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());
}

<强>输出

  

键:ABD,计数:4,值:[123.22,123.22,123.22,123.22]
  关键:ABS,计数:1,值:[3434.34]

答案 1 :(得分:1)

HashMap是一个 Map ,它不能包含重复的键。如果允许重复键,您希望在调用map.get(duplicateKey)时返回哪个值?

答案 2 :(得分:1)

阅读this,特别是'put'方法,其中包含:

  

将指定的值与此映射中的指定键相关联。如果地图以前包含此键的映射,则替换旧值。

您构建代码的方式意味着HashMap将只包含两个键/值对。

public class hash {

public static void main(String[] args) {

    HashMap hashMap = new HashMap();
    hashMap.put("ABS", new Double(3434.34)); // "ABS" key created. 1 object in map.
    hashMap.put("ABD", new Double(123.22)); // "ABD" key created. 2 objects in map.
    hashMap.put("ABD", new Double(123.22)); // "ABD" reference will point to new value.
    hashMap.put("ABD", new Double(123.22)); // .. and again
    hashMap.put("ABD", new Double(123.22)); // .. and again

因此,当您编写五个put行时,只有两个对象将被放置在HashMap中。

您可以使用

hashMap.size()

返回'hashMap'中有多少个键/值对的int值。

答案 3 :(得分:0)

所以你需要将Double + Count作为值然后使用它而不是Double,因为练习使它扩展java.lang.Number:)

Class DoubleCount{
  final double value;
  private int count;
  DoubleCount(double value){
    this.value = value;
  }
  public int getCount(){
    return count;
  } 

  public double getValue(){
   return value;
  }

  public int incCount(){
    return ++count;
  } 
}

答案 4 :(得分:-1)

size = hashMap.size(); 然后使用for循环来迭代