2012-03-11 22 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; 
} 
相關問題