我有一個ArrayList充滿了這些:Java:要使用包含完全自定義對象的ArrayList,我應該重寫equals還是實現Comparable/Comparator?
class TransitionState {
Position positionA;
Position positionB;
int counter;
public boolean equals (Object o){
if (o instanceof TransitionState){
TransitionState transitionState= (TransitionState)o;
if ((this.positionA.equals(transitionState.positionA))
&&(this.positionB.equals(transitionState.positionB)))
{
return true;
}
}
return false;
}
@Override
public String toString() {
String output = "Position A " + positionA.i+ " "+ positionA.j + " "+ positionA.orientation + " "+
"Position B " + positionB.i + " "+ positionB.j + " "+ positionB.orientation;
return output;
}
}
class Position {
int i;
int j;
char orientation;
Position() {
}
void setIJ(int i, int j){
this.i=i;
this.j=j;
}
void setOrientation(char c){
orientation = c;
}
public boolean equals(Object o){
if(o instanceof Position){
Position p = (Position)o;
if((p.i==this.i)&&(p.j==this.j)&&(p.orientation==this.orientation))
{
return true;
}
else return false;
}
return false;
}
} //end class Position
我這個查詢它:
if(!transitionStatesArray.contains(newTransitionState)){ //if the transition state is new add and enqueue new robot positions
transitionStatesArray.add(newTransitionState); //marks as visited
我發現我的transitionStatesArray
裏面重複的元素,這是爲什麼?
我使用這些I,J和方向值的矩陣以填充獨特的價值觀,但在這裏我有一個重複:
S . N
* * *
. D D
E . O
* * *
. D D
N . S
* * *
. D D
S . N
* * *
. D D
這假定OP更改爲使用不同的集合類型。如果他繼續使用'ArrayList'則不相關。 – 2011-05-06 05:59:08
[ArrayList.contains()的規範](http://download.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#contains(java.lang.Object) )保證調用equals()?它由List.contains()和Collection.contains()指定,它們只能保證結果爲真,如果集合包含元素e,使得(o == null?e == null:o.equals(e ) ) 是真的。該實現可以自由使用與任何其他集合相同的hashCode快捷方式。 – verdesmarald 2011-05-06 06:05:16
@veredesmarald - here - http://download.oracle.com/javase/1.5.0/docs/api/java/util/AbstractCollection.html#contains(java.lang.Object) – 2011-05-06 06:38:16