我在试图解决这个问题时遇到了一些麻烦:
我正在使用" 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;
}
}
}
所以我想有更好的方法来做到这一点......:/
答案 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;
}
}