【问题标题】:Sorting HashMap using absolute values of doubles使用双精度的绝对值对 HashMap 进行排序
【发布时间】:2012-09-12 01:16:16
【问题描述】:

我正在尝试使用TreeMapSortedMap<Integer,Double> 类型的哈希图进行排序我想对Doubles 的绝对值进行排序,但我也想保留符号值(因此不存储为未签名的Double)。

下面是我正在使用的代码,但是我没有得到我期望的值,大概是由于使用了hashcode(),有人可以指出如何解决这个问题吗?

Map<Integer,Double> termWeights = new HashMap<Integer,Double>();    
SortedMap sortedData = new TreeMap(new ValueComparer(termWeights));
System.out.println(termWeights);
sortedData.putAll(termWeights);
System.out.println(sortedData);

class ValueComparer implements Comparator {
    private Map _data = null;

    public ValueComparer(Map data) {
        super();
        _data = data;
    }

    public int compare(Object o1, Object o2) {
        Double e1 = Math.abs((Double) _data.get(o1));
        Double e2 = Math.abs((Double) _data.get(o2));
        int compare = e2.compareTo(e1);
        if (compare == 0) {
            Integer a = o1.hashCode();
            Integer b = o2.hashCode();
            return b.compareTo(a);
        }
        return compare;
    }
}

谢谢

【问题讨论】:

  • hashCode 部分应该做什么?如果绝对值相等,为什么不直接返回 0?
  • 返回0Map中有重复值导致信息丢失。
  • 比较器适用于唯一值,当有重复值(在我的情况下)时,我需要进行二次比较,但不再考虑绝对值(我需要) .我想知道如何将绝对值包含在compareTO
  • 如果它有效,我就不会发布了。如果不需要双精度值的绝对值,这个比较器是正确的。但是,正如我提到的,当出现重复并且compare == 0 二次比较无法正确排序时。我知道为什么,因为hashCode() 忽略了双精度数的绝对值。
  • 为什么?他们是最大的两个。下一个要小四个数量级。我觉得不错。

标签: java sorting hashmap


【解决方案1】:

您能否举例说明预期结果和实际结果?

排序地图:{17 = 1.644955871228835,0 = -1.029545248153297,10 = -5.2917656407169E-4,9 = -9 = -3.33319769769785555555555555555555555555555555555555555555255555555555555-4,4,4,12555-4、1 = - -2.0897436261984377E-4, 8=-1.305197184270594E-5, 3=0.0, 4=0.0, 5=0.0, 6=0.0, 11=0.0, 12=0.0, 13=0.0, 14=0.0, 15=0.0, 16=0.0, 18=0.0, 19=0.0, 20=0.0, 21=0.0, 22=0.0}

那么问题出在哪里?

这看起来正确地从大到小排序。

但我会避免在决胜局辅助比较器中使用 hashCode,因为您需要它永远不会为不同的输入返回相同的值。在这种情况下,它可以工作,因为您在 Integer 上调用它,其中 hashCode 只返回相同的 int。但是,如果您在地图中使用 Long 或 String 键,则会发生冲突。而是直接比较这两个键。

最后,您在开始使用比较器后不得更改权重。这将导致不一致的 TreeMap。

【讨论】:

  • 我需要睡觉是问题所在。我没有正确阅读我的结果并注意到数量级的差异。感谢您的建议。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2016-08-24
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多