本文介紹了Java:要在充滿定制對(duì)象的ArrayList中使用包含,我應(yīng)該重寫等于還是實(shí)現(xiàn)可比較/比較器?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我有一個(gè)包含以下內(nèi)容的ArrayList:
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
中發(fā)現(xiàn)重復(fù)元素,為什么會(huì)出現(xiàn)這種情況?
我使用這些i、j和方向值來填充矩陣中的唯一值,但這里有一個(gè)重復(fù)的值:
S . N
* * *
. D D
E . O
* * *
. D D
N . S
* * *
. D D
S . N
* * *
. D D
推薦答案
List.contains(...)
方法被定義為使用equals(Object)
來確定參數(shù)對(duì)象是否包含在列表中。因此,您需要覆蓋equals
…假定默認(rèn)實(shí)現(xiàn)不是您需要的。
但是,您需要注意List.contains(...)
可能會(huì)針對(duì)列表中的每個(gè)元素測試參數(shù)。對(duì)于一份長長的清單來說,這是昂貴的。根據(jù)應(yīng)用程序的詳細(xì)信息,使用不同的集合類型(例如,HashSet
、TreeSet
或LinkedHashSet
)可能比使用List
更好。如果您使用其中之一,您的類將需要重寫hashCode
或?qū)崿F(xiàn)Comparable
,否則您將需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的Comparator
…取決于您選擇的內(nèi)容。
(關(guān)于替代方案的更多建議…因?yàn)椴僮鲉T感興趣)
contains
在List
類ArrayList
或LinkedList
上的性能是O(N)
。contains
調(diào)用的最差開銷與列表長度成正比。
對(duì)于TreeSet
,contains
的最差性能與log2(N)
成正比。
對(duì)于HashSet
或LinkedHashSet
,contains
的平均性能是一個(gè)常量,與集合的大小無關(guān),但最差的性能是O(N)
。(最糟糕的性能發(fā)生在以下情況:1)實(shí)現(xiàn)一個(gè)較差的hashcode()
函數(shù),該函數(shù)將所有內(nèi)容散列為少量的值,或者2)調(diào)整”加載因子”參數(shù),以便哈希表不會(huì)隨著其增長而自動(dòng)調(diào)整大小。)
使用Set
類的缺點(diǎn)是:
它們是集合;即不能將兩個(gè)或更多”相等”對(duì)象放入集合中,并且
無法索引;例如,沒有get(pos)
方法,
某些Set
類甚至不保留插入順序。
在決定使用哪個(gè)集合類時(shí),需要考慮這些問題。
這篇關(guān)于Java:要在充滿定制對(duì)象的ArrayList中使用包含,我應(yīng)該重寫等于還是實(shí)現(xiàn)可比較/比較器?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,