【问题标题】:ArrayList custom class as HashMap keyArrayList 自定义类作为 HashMap 键
【发布时间】:2011-10-10 04:02:26
【问题描述】:

我想将我的数据存储在HashMap<Point[], Double>。我使用迭代来分配数据,但是最后检查时,元素的数量只有1个。我在自定义类Point中实现了hashCode()equals()

HashMap<Point[], Double> hmDistOrd = new HashMap<Point[], Double>();
Point[] keyPts = new Point[2];

for (int i=0; i<intersectionPts.size(); i++) {
p1 = intersectionPts.get(i);
    for (int j=0; j<intersectionPts.size(); j++) {
        p2 = intersectionPts.get(j);                
        if (!p1.equals(p2)) {
            keyPts[0] = p1;
            keyPts[1] = p2;
            d = p1.distance(p2);
            hmDistOrd.put(keyPts, d);
        }
    }
}

有什么提示吗?提前致谢!

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您不能使用数组作为键,因为数组具有来自ObjectshashCodeequals 的默认实现,并且它不认为它是元素。

    要使其工作,您必须覆盖数组的 hashCodeequals,但您不能这样做。

    您可以改用ArrayList,因为它实现了hashCode end equals 比较元素。

    【讨论】:

    • 使用集合而不是数组。这很容易。将映射更改为Map&lt;Collection&lt;Point&gt;, Double&gt; 并使用Arrays.asList() 从数组中填充它。
    • 哦,我刚刚意识到我将键声明为数组。多么愚蠢。让我先编辑它,看看它是否有效。
    【解决方案2】:

    您在每次迭代时将相同的数组实例 keyPts 存储到 HashMap 中(并覆盖其内容)。

    【讨论】:

      【解决方案3】:

      正如 Jim 在他的(已删除)答案中所说,您在地图中多次放置相同的键对象,这将导致替换以前的值。

      但是为每个元素放置一个新数组也不会更好 - 然后你将拥有更多的键值对,但你不能通过 get 方法访问它们,如果你没有正确的数组对象(然后你也可以拥有值),因为数组没有实现.equalshashCode

      提出解决方案:您可以使用List&lt;Point&gt; 作为您的密钥类型,并为每对关键点使用一个新列表。确保在将列表作为键放入地图后不要修改列表。 (您可以通过 Collections.unmodifiableList 将其包装以确保这一点。)

      另一种选择是一些自定义点对类(具有自己的 hashCode 和 equals 实现)。

      【讨论】:

        【解决方案4】:

        当您使用数组作为哈希映射的键时,该数组的 hashCode 方法用于确定键的哈希,而不是您的 Point 类。

        对于您的具体情况,我会尝试使用地图地图:Map&lt;Point, Map&lt;Point, Double&gt;&gt; 或具有 2 个键和一个值的自定义 2D 矩阵类。

        【讨论】:

          猜你喜欢
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-16
          • 2011-11-08
          相关资源
          最近更新 更多