如何在Java中处理访问点(2D (x,y))

问题描述 投票:0回答:1

在一个子问题中,我想获取我访问过的 x-y 平面上的点总数。并且每个点都必须是唯一的。 IE。如果您已经访问过 (1,2) 并且再次遇到此情况,您将不会再次计算它,因为它在访问时已经被计算过。

在java中我们没有任何容器来存储两个变量在一起。(就像在c++中我们有pair) 因此,为了存储点的 x 和 y,我使用大小为 2 的数组。当我遇到任何点时,我将其 x 和 y 值存储到新数组并将其添加到哈希集。 在将其添加到哈希集之前,我检查哈希集是否已包含任何持有相同值的数组。 但是当我使用 Hash_set.contains(temp_array) 检查它时,即使哈希集中存在包含数组的相同值,它也会给出 false。 可能是因为 contains 方法不检查其内部数组包含的值。

请建议任何其他方法。

我还尝试了另一种方法,定义新类来存储 x 和 y。但这里存在同样的问题,因为当我将 x 和 y 存储到此类的对象并将其添加到哈希集中时,我使用 contains() 方法检查是否相同,但它给出 false,即使存在具有相同 x 和 y 值的对象.

请帮我处理我访问过的点。 还告诉我们如何制作数组的哈希集或对象的哈希集,其中 contains() 方法可以正常工作。

HashSet<int[]> hs = new HashSet<>();
        int temp[] = {1,2};
        hs.add(temp);

        int curr[] ={1,2};
        System.out.println(hs.contains(curr));     //it gives false.
arrays object 2d hashset point
1个回答
0
投票

您是对的,当您使用数组或自定义对象作为元素时,Java 中的

HashSet.contains()
方法无法按预期工作。这是因为 Java 中数组和自定义对象的默认
hashCode()
equals()
方法使用对象标识(即两个对象是否是同一实例)而不是对象内容(即两个对象是否具有相同的值)。

为了解决您的问题,您可以定义自己的类来表示 x-y 平面中的点,并重写

hashCode()
equals()
方法来比较点的内容。这是一个例子:

public class Point {
    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Point)) {
            return false;
        }
        Point other = (Point) o;
        return other.x == x && other.y == y;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + x;
        result = 31 * result + y;
        return result;
    }
}

使用这个 Point 类,您可以创建一个 HashSet 来存储您访问过的点:

HashSet<Point> hs = new HashSet<>();
Point temp = new Point(1, 2);
hs.add(temp);

Point curr = new Point(1, 2);
System.out.println(hs.contains(curr)); // prints "true"

请记住,我们重写 h

ashCode()
方法以根据点的内容(即 x 和 y 值)返回哈希码,并且我们重写
equals()
方法以使用以下命令比较两个点的内容原始 int 类型的 == 运算符。

© www.soinside.com 2019 - 2024. All rights reserved.