首先,我的问题是关于Java中的HashSet,我遇到的问题是:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2
at Main$State.hashCode(Main.java:92)
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.containsKey(HashMap.java:595)
at java.util.HashSet.contains(HashSet.java:203)
at Main.uniform_cost_search(Main.java:128)
at Main.main(Main.java:109)
我有一个类名State,它有变量:int cost,int [3] parent,byte [22] encode
import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Set;
public class Main {
static class State {
public int cost;
public int[] parent = new int[3];
public byte[] encode = new byte[22];
public State(int cost, int[] parent, byte[] encode){
this.cost=cost;
for (int i=0; i<3; i++)
this.parent[i]=parent[i];
for (int i=0; i<22; i++)
this.encode[i]=encode[i];
}
public void printState(){
System.out.printf(" cost=%d,parent=[%d,%d,%d],[",
cost, parent[0], parent[1],
parent[2]);
for (int i=0; i<22; i++)
if (i%2==0)
System.out.printf("%d.", encode[i]);
else if (i==21)
System.out.printf("%d", encode[i]);
else
System.out.printf("%d ", encode[i]);
System.out.printf("]\n");
}
// for HashSet
@Override
public boolean equals(Object o){
if (o instanceof State){
State other = (State) o;
for (byte i=0; i<22; i++)
if (encode[i] != other.encode[i])
return false;
return true;
}
return false;
}
// for HashSet
@Override
public int hashCode() {
int re=0;
for (byte temp : encode)
re += encode[temp]*encode[temp]*encode[temp];
return re;
}
}
所以,我对hashCode()函数的目的是散列encode []数组,使HashSet与encode []数组的值不同
在我的main函数中,当我创建一个main函数时:
public static void main(String[] args) {
System.out.println("hello world");
Set<State> visited= new HashSet<State>();
byte[] destination = new byte[22];
destination[0]=-2;destination[1]=4;
State goldState = new State(0, new int[]{0,0,0}, destination);
visited.add(goldState);
if (visited.contains(goldState))
System.out.printf("contain goldState\n");
}
运行代码,我收到错误。
我非常感谢你的建议。
运行方法goldState.printState(),输出等价于数据int cost,int [3] parent,byte [22]编码是:
cost=0,parent=[0,0,0],[-2.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
答案 0 :(得分:3)
问题在于:
public int hashCode() {
int re=0;
for (byte temp : encode)
re += encode[temp]*encode[temp]*encode[temp];
return re;
}
for
循环遍历数组encode
并为您提供值,而不是索引。因此下一行应该是
re += temp*temp*temp;
您实际编码的是尝试使用值作为索引,这会在尝试使用-2
(值)作为索引时导致错误。