这是我在这里的第一个问题,但我希望我能提供所有需要的信息。
如果不是,请告诉我!
我的问题:
我试图通过添加一个 HashMap 来存储已经处理的结果来改进我的回溯算法。为此,我为该 HashMap 的键创建了一个自己的类。在那里我覆盖了 .equals()- 和 .hashCode()- 方法。
但是,如果我尝试将这个键和它的值放入映射中,这将花费很多时间,因此算法变得比没有映射的回溯算法效率更低。
为了解决这个问题,我将 HashMap-Key 更改为 String 并将 .toString() 方法添加到我的键类中。这工作得很好,而且速度很快。(奇怪的事情: .toString().hashCode() 产生很多负值,但似乎有效)
现在我的问题:
如果您创建自己的密钥,它是否总是减慢那么多?
我试图自己找到这个问题的答案,而我发现的唯一问题是更改 .hashCode() 或使用 HashMap-Constructor 的参数。
我尝试了这两种方法,并为我的测试环境导出了生成的 HashCodes,但我没有找到任何重复项,尽管我知道,这不是哈希码的“好”方法!
这是我的 HashKey-Class 的副本(变量和方法的名称已更改):
public class HashKey {
private final int int0, int1, int2;
public HashKey(int int0, int int1, int int2) {
this.int0 = int0;
this.int1 = int1;
this.int2 = int2;
}
public int getInt0() {
return this.int0;
}
public int getInt1() {
return this.int1;
}
public int getInt2() {
return this.int2;
}
@Override
public int hashCode() {
final int prime1 = 107;
final int prime2 = 227;
final int prime3 = 499;
int result = 1;
result = prime1 * result + this.int2;
result = prime2 * result + this.int1;
result = prime3 * result + this.int0;
return result;
}
@Override
public String toString() {
return "Int0: " + this.int0 + " Int1: " + int1 + " Int2: " + int2;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof HashKey) {
boolean eq0, eq1, eq2;
eq0 = this.int0 == ((HashKey) obj).getInt0();
eq1 = this.int1 == ((HashKey) obj).getInt1();
eq2 = this.int2 == ((HashKey) obj).getInt2();
if (eq0 && eq1 && eq2) {
return true;
}
}
return false;
}
}
在我的主类中,我使用这个:
HashMap<HashKey, List<Object>> storedResults = new HashMap<HashKey, List<Object>>();
int x1,x2,x3;
Object obj;
// later in a method:
storedResults.put(new HashKey(x1,x2,x3), obj);
如果我将键的类型更改为字符串并将该字符串放入地图中,它工作正常!因此 HashKey.hashCode() 方法和算法的其余部分工作正常并且速度非常快。
有谁知道,我能做些什么来使用这个 HashKey?对于这个算法,它并不那么重要,但我想知道它以用于未来的算法!
如果有任何问题或批评:非常欢迎他们!
提前致谢!
克伦贝