将HashMap转换为已排序的TreeMap

时间:2013-09-24 13:08:44

标签: java hashmap treemap

我有一个HashMap,它包含String作为键,Object作为值为了对HashMap进行排序我创建了一个TreeMap,遍历HashMap并将HashMap的每个条目放入一个TreeMap中,其中key是带宽和值信号的实例。这是我的代码

public void createSortedSet(HashMap<String, Signal> map, long totalSize) {
TreeMap<Float, Signal> sortedMap = new TreeMap<Float, Signal>();
JOptionPane.showMessageDialog(null, map.size());
   try {

    final Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        String messageName = iterator.next();
        Signal signal = map.get(messageName);
        signal.setBandwidth((signal.getSize() / (float) totalSize) * 100);
        sortedMap.put(signal.getBandwidth(), signal);
    }
    JOptionPane.showMessageDialog(null, sortedMap.size());

  } catch (Exception e) {
    e.printStackTrace();
  }
}

这里的问题是地图的大小是8318而在while循环之后我检查TreeMap的大小时它给出了455 ??这是否意味着并非所有信号实例都存储在TreeMap中

任何帮助?

3 个答案:

答案 0 :(得分:0)

请注意,您在TreeMap中使用的密钥与HashMap中的密钥不同。作为Map,密钥必须是唯一的。 put方法将使用相同的键替换任何先前的值。您的新密钥计算可能会产生重复,并导致新地图的大小低于旧地图。

答案 1 :(得分:0)

我希望问题是您在原始地图中有条目,其“大小”(由getSize()返回)是相同的。由于Map不能为同一个键保存多个值,因此原始的具有相同“大小”的条目将被删除。

答案 2 :(得分:0)

不同的信号包含等于带宽sortedMap.put(signal.getBandwidth(), signal);