2013-11-22 368 views
0

我需要一個解決方案來更改Java中多維ArrayList中元素的值。這是我的ArrayList: 公共類用戶{更改多維ArrayList的值

ArrayList<ValidateUser> personer = new ArrayList<ValidateUser>(); 

public Users() { 
    personer.add(new ValidateUser("admin", "asdf123", 0.8, "admin")); 
    personer.add(new ValidateUser("jesper", "ukamm19", 2.5, "user")); 
    personer.add(new ValidateUser("lars", "lol123", 1.5, "user")); 
} 

我想在用戶「admin」的改變雙值(0.8),例如。 這將從另一個班上完成。 如何做?

提前致謝! :)

+2

這看起來不是多維的。只需遍歷列表即可找到該對象。如果你要做很多事情,可以考慮使用地圖。 – Zong

+0

正如@ZZhengZhengLi已經說過的,找到列表中的對象並更改它的值。就這樣。 – Thomas

+0

我對java很陌生,所以對不起,如果我在多維的術語不正確。 –

回答

1

正如我在我的評論中所述,只是遍歷列表來找到對象。如果你要做很多事情,可以考慮使用地圖。

for (ValidateUser user : personer) 
    if (user.getName().equals("admin")) 
     user.setNumber(someNumber); 
+0

WOuld不會拋出ConcurrentModificationException? – Adarsh

+0

@Adarsh不,我們正在修改對象,而不是列表。 – Zong

1

首先,請注意,這不是一個多維數組,僅僅是持有ValidateUser類對象引用元素的列表。其次,您需要在更新元素之前訪問該元素。您可以通過多種方式來實現:

  1. 實現你的ValidateUserequalshashCode方法,那麼就檢索列表中的對象:

    ValidateUser adminUser = personer.get(new ValidateUser("admin", "", 0.8, "")); 
    adminUser.set... 
    

    注:這看起來可笑,但將工作(假設您的equals方法僅通過保存此"admin"值的字段進行檢查。

  2. 瀏覽數組並尋找所需的元素手動,然後更新它:

    for (ValidateUser user : personer) { 
        if ("admin".equals(user.getXxx()) { 
         user.set... 
         break; //don't forget this! 
        } 
    } 
    
  3. 使用不同的數據結構像一個Map<String, ValidateUser>來存儲你的數據和更快的檢索:

    Map<String, ValidateUser> personerMap = new LinkedHashMap<String, ValidateUser>(); 
    personerMap.add("admin", new ValidateUser("admin", ...); 
    //fill the map with other values... 
    //if you still want a Collection<ValidateUser> personer variable 
    Collection<ValidateUser> personer = personerMap.values(); 
    
    //now check for the desired element 
    ValidateUser admin = personerMap.get("admin"); 
    if (admin != null) { 
        admin.set... 
    } 
    

通過的意見,你的ValidateUser是一個不可變的對象,所以你不能使用setter更新它的字段(因爲沒有)。所以,最好的方法是使用ListIterator<ValidateUser>代替(不要與Iterator混淆),並用您的修改對象替換元素。這裏有一個例子:

//the new immutable ValidateUser that will replace the older one... 
//set the parameters as needed 
ValidateUser newAdmin = new ValidateUser("admin", ...); 
ListIterator<ValidateUser> listIterator = personer.listIterator(); 
while (listIterator.hasNext()) { 
    ValidateUser validateUser = listIterator.next(); 
    if ("admin".equals(validateUser.getXxx()) { 
     listIterator.set(newAdmin); 
     break; 
    } 
} 
+0

嗨Luiggi,謝謝你的一個很好的答案。我正在使用選項2,但是.set方法也有問題。 我有一個名爲「temp」的雙變量,它應該替換內容。我的代碼以users.personer.set(i,temp);在我的for循環中,但它給了我錯誤。問題是什麼? –

+0

而不是使用'personer'。set(index,temp)',在你的'personer'列表中找到ValidateUser validateUser對象,然後修改這個'validateUser'對象(使用它的set方法)。 –

+0

我的ValidateUser沒有set-method,它們都由ValidateUser中的構造函數設置。 –