我的hashmap有这样的键:'2 + 4 + 5','653 + 65 + 1324 + 75'。(由+符号分隔的整数值)
什么可能是一个好的哈希码和等于方法,以便像'2 + 4 + 5','5 + 4 + 2','4 + 5 + 2'......这些键(所有的排列为2,4) ,5)应返回相同的哈希码值,equals应返回true。
我打算在键中取整数值,对它们进行排序,将它们按升序排列到字符串中,然后调用字符串hashcode和equals方法。假设我有'5 + 2 + 4'然后我将其更改为“245”并调用字符串hashcode和equals方法。但是,每次我必须进行排序时,这将是一项昂贵的操作。而散列图中的所有方法,比如put,get ......都会很昂贵
还有其他方法可以在日志或线性时间内完成此操作......
答案 0 :(得分:2)
一个好的哈希码算法应该返回非常不同的哈希值,以便在输入方面略有不同。在您的情况下,您还会将值的排列视为“相等”。
似乎一个好的方法是解析组成整数然后对它们进行排序(一种简单的方法来确保一致的比较顺序)然后:
如果它们具有相同的已排序组成数,则考虑两个值相等。
使用经过验证的哈希方法,例如
hash = value1 + 31 * value2 + 31 * 31 * value3 + 31 * 31 * 31 * value4 + etc.
答案 1 :(得分:1)
简单而有效:
public int hashcode(){
int hash=5;
for(int i:array)
hash=hash*17+i;
return hash;
}
答案 2 :(得分:1)
class Combination {
final int[] parts;
Combination(String str) {
String[] strings = str.split("\\+");
parts = new int[strings.length];
for (int i = 0; i < parts.length; i++) {
parts[i] = Integer.parseInt(strings[i]);
}
Arrays.sort(parts);
}
@Override public int hashCode() {
return Arrays.hashCode(parts);
}
@Override public boolean equals(Object o) {
return o instanceof Combination && Arrays.equals(parts, ((Combination) o).parts);
}
}
测试代码:
public static void main(String[] args) {
Set<Combination> set = new HashSet<>();
set.add(new Combination("1+2+3"));
set.add(new Combination("1+2+4"));
System.out.println(set.contains(new Combination("3+2+1"))); // prints "true"
System.out.println(set.contains(new Combination("4+2+1"))); // prints "true"
System.out.println(set.contains(new Combination("4+3+1"))); // prints "false"
}