2013-11-22 3 views
0

Java에서 다차원 ArrayList의 요소 값을 변경하려면 솔루션이 필요합니다. 공용 클래스 사용자 {내가 예를 들어, 사용자가 "관리자"에서 double 값 (0.8)을 변경하려면다차원 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")); 
} 

: 이것은 내 ArrayList를합니다. 이것은 다른 클래스에서 수행됩니다. 어떻게 그렇게합니까?

미리 감사드립니다. :)

+2

이것은 다차원 적으로 보지 않습니다. 목록을 반복하여 개체를 찾습니다. 이 작업을 많이 수행하려면지도 사용을 고려하십시오. – Zong

+0

@ ZongZhengLi가 이미 말했듯이, 목록 내에서 개체를 찾고 값을 변경합니다. 그게 다야. – Thomas

+0

저는 다차원이라는 용어에서 틀렸을 때 매우 유감 스럽습니다. –

답변

1

내 의견에 언급했듯이 개체를 찾기 위해 목록을 반복합니다. 이 작업을 많이 수행하려면지도 사용을 고려하십시오. 먼저

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

이 경우 ConcurrentModificationException이 발생하지 않습니까? – Adarsh

+0

@Adarsh ​​아니요, 우리는 목록이 아닌 개체를 수정하고 있습니다. – Zong

1

는,이, 다차원 배열이 아닌 ValidateUser 클래스 객체 참조의 요소를 보유 목록이 그냥 있습니다. 둘째, 요소를 업데이트하기 전에 요소에 액세스해야합니다.

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

참고 :

  1. 다음 당신의 목록에서 개체를 검색하여 ValidateUser 클래스의 equalshashCode 방법을 구현 :이 말도 보이지만 작동이 작업을 수행하는 여러 가지 방법이 (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은 변경할 수없는 개체이므로 setters를 사용하여 해당 필드를 업데이트 할 수 없습니다 (없기 때문에). 따라서 가장 좋은 방법은 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-loop에서는 오류가 발생합니다. 문제가 무엇입니까? –

+0

대신에 'personer'를 사용하십시오.set (index, temp)'를 호출하고,'personer'리스트에서'ValidateUser validateUser' 객체를 찾은 다음 ('set '메소드를 사용하여)이'validateUser' 객체를 수정하십시오. –

+0

My ValidateUser에는 set-method가 없으며 모두 ValidateUser의 생성자에 의해 설정됩니다. –