2012-03-11 51 views
1

需要一些关于如何更新列表的帮助。我有一个类,它定义了字符串名称,字符串状态,float lat和float long的对象。如果对象存在,则更新数组列表

每次玩家移动一台服务器向我发送这些变量的异步消息时,唯一改变的可以是状态经纬度和长度,这是我想要“覆盖”的那个。这个名字是独一无二的,所以我猜测我必须根据这个来搜索,因为这是永远不会改变的事情。我想更新现有的对象以防止一个玩家出现多次。

我的(非功能性)到目前为止的代码:

if(players.size()==0){ ///// 1. 
         Player p = new Player(); 
         p.name = split[2]; 
         p.status = split[3]; 
         p._lat = Float.valueOf(split[4]); 
         p._long = Float.valueOf(split[5]); 
         players.add(p); 
        }//This works 


        else{ ///// 2. 
        for(int i = 0; i < players.size(); i++){ ///// 3. 
         if(players.get(i).name.equals(split[2])){ 
          Player p = new Player(); 
          p.name = split[2]; 
          p.status = split[3]; 
          p._lat = Float.valueOf(split[4]); 
          p._long = Float.valueOf(split[5]); 
          players.add(p); 
          players.add(i, p); 
         } 
         else{ ///// 4. 
          Player p = new Player(); 
          p.name = split[2]; 
          p.status = split[3]; 
          p._lat = Float.valueOf(split[4]); 
          p._long = Float.valueOf(split[5]); 
          players.add(p); 
         } 
        }//This doesnt 
        } 

这可能是一些明显的,但我真的不知道如何查找和替换的对象。我之后的功能是:

  1. 检查列表是否为空,在这种情况下,无法在其中添加播放器,因此只需添加一个。
  2. 如果列表存在循环,并查找对象的名称。
  3. 如果名称存在,只需再次创建相同的播放器,但其更新值位于同一索引处。
  4. 该列表存在但名称未找到,因此只需添加播放器即可。

我的代码到目前为止让我在一个永无止境的循环我猜,因为应用程序停止响应。 split变量是从异步调用中分离出来的一个词,这是我通过打印检查的名称。

+0

听起来像[图](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Map.html)给我...... – dmon 2012-03-12 00:22:26

回答

4

,而不是

players.add(p); 
players.add(i, p); 

使用

players.set(i, p) 
+0

嗯,这追加它或覆盖现有的一个,但它也在数组列表的末尾添加了一个新的玩家 – nejs 2012-03-12 07:53:29

+0

经过一些更多的测试后,这只与列表中的一个对象一起工作。它会覆盖它,但是如果我添加第二个对象,它会开始将之前的现有对象添加到数组列表的末尾。它看起来像它这样做:只有一个存在覆盖,存在两个对象,第一个匹配,不,并添加一个新的,它现在循环第二个对象上的两个对象,第一个对象名称不匹配,因此它添加了一个新的一。我如何防止这种情况?如果发现匹配,则需要以某种方式从循环中取出。 – nejs 2012-03-12 08:08:50

0

嗯,我终于把dmons的建议,并提出了HashMap的,我不知道,如果它的好做法,但它似乎与此,而不是工作:

if(players.size()==0){ 
         Player p = new Player(); 
         p.name = split[2]; 
         p.status = split[3]; 
         p._lat = Float.valueOf(split[4]); 
         p._long = Float.valueOf(split[5]); 
         players.add(p); 
         hash.put(split[2], p); 
        } 
        else{ 
         Player p = new Player(); 
         p.name = split[2]; 
         p.status = split[3]; 
         p._lat = Float.valueOf(split[4]); 
         p._long = Float.valueOf(split[5]); 
         players.add(p); 
         hash.put(split[2], p); 
         } 

随着哈希映射在oncreate中被实例化并接受一个字符串键,这是一个名字和一个播放器对象。

1

你可以使用indexOf来知道p对象是否存在于玩家内部。如果不存在或者p对象存在于玩家内部,则返回-1。

Player p = new Player(); 
    p.name = split[2]; 
    p.status = split[3]; 
    p._lat = Float.valueOf(split[4]); 
    p._long = Float.valueOf(split[5]); 

    if(players.size()==0){ 
     players.add(p); 
    } 
    else{ 
     int index=players.indexOf(p); 
     if (index==-1){ 
      players.add(p); 
     } 
     else{ 
      players.set(index,p); 
     } 
    } 

诀窍是在您的Player类中添加此方法,该方法覆盖indexOf上使用的等号方法。这样,您可以为两个Player对象设置相同的必要条件(仅限您的案例中的名称)。

@Override 
public boolean equals(Object o) { 
    if (o == this) { 
     return true; 
    } 
    if (o == null) { 
     return false; 
    } 
    if (o.getClass() == this.getClass()) { 
     String a = this.name; 
     String b = ((Player) o).name; 
     return a.equalsIgnoreCase(b); 
    } 
    return false; 
} 
相关问题