在一个子问题中,我想获取我访问过的 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.
您是对的,当您使用数组或自定义对象作为元素时,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 类型的 == 运算符。