gpt4 book ai didi

Java MultiMap 无法识别键

转载 作者:行者123 更新时间:2023-12-02 15:03:23 29 4
gpt4 key购买 nike

我试图在数据结构中存储一个键的多个值,因此我使用 Guava(Google Collection)的 MultiMap。

Multimap<double[], double[]> destinations = HashMultimap.create();
destinations = ArrayListMultimap.create();

double[] startingPoint = new double[] {1.0, 2.0};
double[] end = new double[] {3.0, 4.0};
destinations.put(startingPoint, end);

System.out.println(destinations.containsKey(startingPoint));

它返回 false。

注意:键值存储在多重映射中,因为当我将某些东西放在那里时,destinations.size() 会增加。当键是String时,也不会发生这种情况> 而不是 double[]

知道问题出在哪里吗?

编辑:非常感谢 Jon Skeet,我现在实现了该类:

class Point {

double lat;
double lng;

public boolean equals(Point p) {

if (lat == p.lat && lng == p.lng)
return true;
else
return false;
}

@Override
public int hashCode() {

int hash = 29;
hash = hash*41 + (int)(lat * 100000);
hash = hash*41 + (int)(lng * 100000);

return hash;
}

public Point(double newlat, double newlng) {
lat = newlat;
lng = newlng;
}
}

现在我遇到了一个新问题。这就是我的使用方式:

Multimap<Point, Point> destinations = HashMultimap.create();
destinations = ArrayListMultimap.create();

Point startingPoint = new Point(1.0, 2.0);
Point end = new Point(3.0, 4.0);
destinations.put(startingPoint, end);

System.out.println( destinations.containsKey(startingPoint) );
System.out.println( destinations.containsKey(new Point(1.0, 2.0)) );

第一个返回 true,第二个返回 false。如果我将 @Override 放在 equals 方法之前,它会给我一个错误。知道现在的问题是什么吗?

谢谢:)

Edit2:当我将 equals 更改为以下内容时,它现在的行为完全符合预期:

@Override
public boolean equals(Object p) {

if (this == p)
return true;
else if ( !(p instanceof Point) )
return false;
else {
Point that = (Point) p;
return (that.lat == lat) && (that.lng == lng);
}
}

谢谢大家。

最佳答案

您使用数组作为哈希键。这是行不通的——Java 不会覆盖数组的 hashCodeequals 。 (Arrays 类提供了执行此操作的方法,但它不会在这里为您提供帮助。)不可否认,我希望它能够在这种特定情况下工作,在这种情况下,您使用的是 exact putcontainsKey 具有相同的引用...当我测试您的代码时,它会打印 true。您确定可以使用您的代码完全重现它吗?

例如,虽然我希望它适用于您给出的代码,但我不会期望它能够工作:

// Logically equal array, but distinct objects
double[] key = (double[]) startingPoint.clone();
System.out.println(destinations.containsKey(key));

听起来您不应该在这里使用 double[] - 您应该创建一个具有两个 double 变量的 Point 类,并覆盖 equalshashCode

此外,由于二进制浮点算术的性质,在哈希键中使用double值通常是一个坏主意。即使使用上面的 Point 想法,这也会是一个问题......如果你不需要实际做任何算术(如果你只是复制值),那应该没问题,但要注意关心...

关于Java MultiMap 无法识别键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10028900/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com