Java ArrayList尝试检查是否存在具有此名称的对象

时间:2017-05-04 01:52:40

标签: java object arraylist

我在试图解决这个问题时遇到了一些麻烦: 我正在使用" rankList&#34 ;,一个由"得分"组成的arrayList。为它评分具有以下属性的对象:name,wins,loses,draw。我的类排名有一个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;
            }
        }

    }

所以我想有更好的方法来做到这一点......:/

3 个答案:

答案 0 :(得分:1)

ArrayList不是正确的数据结构。要检查数组中是否存在元素,您要搜索整个arraylist。这意味着它是O(N)。

要保持数组列表的排序顺序,并对它进行二进制搜索肯定会更快,如评论中所建议的那样。但这并不能解决你所有的问题,因为插入中间会很慢。请参阅此问答:When to use LinkedList over ArrayList?

一个建议是使用Map。然后你将存储玩家名称,玩家对象对。这样可以让你快速查看。最糟糕的情况是O(log N)我相信。

还值得一提的是,您最终可能需要永久记录这些分数。如果这样,索引的RDBMS将为您提供更好的性能并使您的代码更简单。

答案 1 :(得分:1)

尝试使用带密钥的哈希表,效率会更高!

答案 2 :(得分:0)

e ..为什么不使用地图&lt;&gt;。

如果必须使用List,像这样的代码

,二进制搜索是个好主意
    List<Method> a= new ArrayList<>();
    //some method data add...
    int index =  Collections.binarySearch(a, m);
    Method f = a.get(index);

和类方法是Comparable的impl,然后覆盖compareTo()方法

public class Method implements Comparable<Method>{
........
@Override
public int compareTo(Method o) {
    return this.methodName.compareTo(o.getMethodName());
}

如果你不想使用binsearch,公共区域的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;
            }
        }