[英]Java ArrayList trying to check if object with this name exists
我在嘗試解決這個問題時遇到了麻煩:我正在研究“ rankList”,即由“ Score”制成的arrayList。 得分是具有以下屬性的對象:名稱,勝利,失敗,抽獎。 我的課程Rank具有一個Score對象的ArrayList。 要創建一個新的Score對象,我只需使用名稱(並將其余的設置為0,因為它是新名稱)。 但是我正在嘗試檢查玩家的名字是否已經在rankList中,我不必創建新的名字,但總之輸贏或平局。 我一直在讀《我的世界》,我必須重寫等於,然后其他人說我必須重寫“包含...”。 我最快的解決方案是編寫一個“ for”,它繞着arrayList並使用getName().equals("name");
但是,這在我的代碼中變得太亂了。 我有checkPlayer(如果在列表中有palyer):
public boolean checkPlayer(String playerName) {
for (int i = 0; i < this.rankList.size(); i++) {
if (this.rankList.get(i).getName().equals(playerName)) {
return true;
}
}
return false;
}
然后,如果我想增加勝利,我會得到:
public void incraseWins(String playerName) {
if (checkPlayer(playerName)) {
for (int i = 0; i < this.rankList.size(); i++) {
if (this.rankList.get(i).getName().equals(playerName)) {
this.rankList.get(i).setWins(this.rankList.get(i).getWins() + 1);
break;
}
}
} else {
createPlayer(playerName);
//more for to get to the player i'm looking for...
for (int i = 0; i < this.rankList.size(); i++) {
if (this.rankList.get(i).getName().equals(playerName)) {
this.rankList.get(i).setWins(this.rankList.get(i).getWins() + 1);
break;
}
}
}
所以我想有一個更好的方法來做到這一點...:/
ArrayList在這里不是正確的數據結構。 要檢查數組中是否存在元素,請搜索整個arraylist。 這意味着它是O(N)。
要保留數組列表的排序順序,並按照注釋中的建議進行二進制搜索,絕對會更快。 但這並不能解決您的所有問題,因為插入中間位置會很慢。 請參閱此問答: 何時在ArrayList上使用LinkedList?
一種建議是使用Map 。 然后,您將存儲播放器名稱,播放器對象對。 這將使您快速查找。 我認為最糟糕的情況是O(log N)。
還值得一提的是,您最終可能需要永久記錄這些分數。 如果是這樣,建立索引的RDBMS將為您提供更好的性能,並使您的代碼更簡單。
嘗試使用帶有鍵的哈希表,它將更加高效!
e ..為什么不使用map <>。
如果必須使用List,則二進制搜索是一個好主意,代碼如下
List<Method> a= new ArrayList<>();
//some method data add...
int index = Collections.binarySearch(a, m);
Method f = a.get(index);
並且類方法是Comparable的隱式,然后重寫compareTo()方法
public class Method implements Comparable<Method>{
........
@Override
public int compareTo(Method o) {
return this.methodName.compareTo(o.getMethodName());
}
如果您不想使用binsearch,則CommonU的CollectionUtils可以為您提供幫助
CollectionUtils.find(a, new Predicate() {
@Override
public boolean evaluate(Object object) {
return ((Method)object).getMethodName().equals("aaa");
}
});
實際上CollectionUtils.find也是“ for”
for (Iterator iter = collection.iterator(); iter.hasNext();) {
Object item = iter.next();
if (predicate.evaluate(item)) {
return item;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.