2013-11-22 3 views
0

Мне нужно решение для изменения значения элемента в многомерном массиве ArrayList в Java. Это мой 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")); 
} 

Я хочу, чтобы изменить двойное значение (0.8) на пользователя «администратора», например. Это будет сделано из другого класса. Как это сделать?

Заранее благодарен! :)

+2

Это не выглядит многомерным. Просто перейдите в список, чтобы найти объект. Если вы собираетесь это сделать, подумайте об использовании карты. – Zong

+0

Как уже сказал @ZongZhengLi, найдите объект в списке и измените его значение. Это все. – Thomas

+0

Я очень новичок в java, поэтому извините, если я ошибаюсь в терминах многомерного. –

ответ

1

Как я уже сказал в своем комментарии, просто перейдите по списку, чтобы найти объект. Если вы собираетесь это сделать, подумайте об использовании карты.

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

Не этот бросок ConcurrentModificationException? – Adarsh

+0

@Adarsh ​​Nope, мы модифицируем объект, а не список. – Zong

1

Во-первых, обратите внимание, что это не является многомерный массив, это просто список, который содержит элементы ValidateUser ссылок на объекты класса. Во-вторых, вам необходимо получить доступ к элементу перед его обновлением. У вас есть несколько способов сделать это:

  1. Реализовать equals и hashCode методы в вашем ValidateUser классе, а затем просто получить объект из вашего списка:

    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 - неизменный объект, поэтому вы не можете обновлять свои поля с помощью сеттеров (потому что их нет). Итак, лучше всего использовать вместо этого 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

Привет Луиджи, спасибо за отличный ответ. Я собираюсь с вариантом 2, но у меня проблема с методом .set. У меня есть двойная переменная с именем temp, которая должна заменять содержимое. Мой код работает как users.personer.set (i, temp); в моем for-loop, но это дает мне ошибку. В чем проблема? –

+0

Вместо использования 'personer.set (index, temp) ', найдите объект ValidateUser validateUser' в списке' personer', затем измените этот объект 'validateUser' (используя его методы набора). –

+0

У моего ValidateUser нет set-method, все они устанавливаются конструктором в ValidateUser. –

Смежные вопросы