簡體   English   中英

Java ArrayList嘗試檢查具有此名稱的對象是否存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM