【问题标题】:Converting a HashMap to a Sorted TreeMap将 HashMap 转换为排序的 TreeMap
【发布时间】:2013-09-24 13:08:43
【问题描述】:

我有一个 HashMap,其中包含 String 作为 key 和一个 Object 作为 value 为了对我的 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中

有什么帮助吗?

【问题讨论】:

  • 运行调试器查看多个信号对象是否共享相同的大小。
  • 你的意思是相同的带宽?
  • 对,但是带宽归结为大小,因为totalSize 没有变化。

标签: java hashmap treemap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2019-02-16
        • 1970-01-01
        • 2015-12-01
        • 2019-03-02
        相关资源
        最近更新 更多