2013-11-04 2 views
8

매우 간단합니다내 사용자 지정 개체가 있다고 가정합니다. 예를 들어 :ArrayList Id로 개체 검색

class Account 
{ 
public String Name; 
public Integer Id; 
} 

내 응용 프로그램의 많은 부분에 Id 매개 변수를 기반으로 특정 Account 개체를 검색합니다. 이것에 대해 가장 좋은 방법은 무엇입니까?

나는 ArrayList을 확장 할 생각 이었지만 더 나은 방법이 있어야한다고 확신합니다.

+5

'ArrayList '의 모든 요소에 대해'Map' 또는 iterate를 사용하십시오. –

+0

대신지도 (HasMap) 또는 세트 (HashSet)를 사용하십시오. – wxyz

답변

12

실제로 사용하고자하는 것은 Map이며 키를 기반으로 값을 검색 할 수 있습니다. ArrayList을 사용하는 경우 유일한 옵션은 전체 목록을 반복하고 해당 개체를 검색하는 것입니다. 같은

뭔가 :

for(Account account : accountsList) { 
    if(account.getId().equals(someId) { 
     //found it! 
    } 
} 

accountsMap.get(someId) 

대이 작동 종류는 List에서 Map에서 O(1), 대 O(n)입니다.

나는 ArrayList를 확장하려고 생각하고 있었지만, 더 좋은 방법은 이어야합니다.

일반적으로 말하면, 이는 잘못된 디자인입니다. 이유에 대한 더 나은 이해를 위해 Effective Java 항목 16을 읽거나이 내용을 확인하십시오. article.

+2

해시 기반지도 만 'O (1)'조회를 제공합니다. –

+0

동의, 좋은 의견 –

1

ArrayList는 포함 된 요소를 정렬하지 않습니다. ArrayList에서 단일 요소를 찾으려면 목록을 반복하고 각각을 원하는 값과 비교해야합니다.

Account foundAccount; 
for(Account a : accountList){ 
    if(a.Id == targetID){ 
    foundAccount = a; 
    break; 
    } 
} 
if(foundAccount != null){ 
    //handle foundAccount 
} 
else{ 
    //not found 
} 

다른 방법으로는 컨테스트 된 데이터를 정렬하고 정보를 유지하는보다 지능적인 데이터 구조를 사용할 수 있습니다.

맵 인터페이스 (특히 HashMap 구현)를 연구하려고합니다. 이렇게하면 각 요소를 특정 키와 연결된 순서로 저장할 수 있습니다. 따라서 각 객체를 ID를 키로하는 HashMap에 배치 한 다음 특정 키의 객체가 있는지 직접 HashMap에 요청할 수 있습니다.

2

정렬되지 않은 목록이라고 가정하면 목록을 반복하여 각 개체를 검사해야합니다.

for(int i = 0; i < sizeOfList; i++) { 
    list.get(i).equals(/* What you compare against */) 
} 

또한 다른 for 구문있다 :

for(Account a : accountList) 

당신은 Account를 받아 각 항목에 대해 그것을 비교하는 도우미 메서드에이 루프를 넣을 수 있습니다.

주문 목록의 경우보다 효율적인 검색 옵션이 있지만 무엇이든지 상관없이 검색을 구현해야합니다.

1

당신은 예를 들어지도를 사용해야합니다

private Map<String, int> AccountMap; 
for (String account : accounts) 
      AccountMap.put(account, numberofid); 
1

ArrayList을 확장하는 문제에 대한 좋은 해결책이 거의 절대 없습니다. 이것은 기본 Java 구현 인 List으로, 특정 순서로 객체를 저장하고 색인으로 객체를 검색 할 수 있습니다. 당신이 고유 식별자를 사용하여 인덱스 요소로 할 수 있도록하려면

, 당신은 Map로보고 있고, 그 구현 HashMap 수 있습니다.

Map<Integer, Account>을 사용하면 문제를 해결하는 데 도움이 될 수 있습니다.

  • 개체 삽입 : map.put(id, account) 대신 list.add(account)
  • 가져 오는 객체 : map.get(id)

이 가장 빠른 구현 될 것입니다. 그러나, 당신이 이것을 변경할 수없는 경우, 당신은 여전히 ​​당신의 ArrayList을 반복하고 올바른 계정을 찾을 수 있습니다지도를 사용하는 것이 작업을 수행하는

for (Account acc : accounts) { 
    if (acc.getId() == yourId) { 
    return acc; 
    } 
} 
throw new NoSuchElementException(); 
1

더 좋은 방법입니다. 귀하의 경우에는

, 당신은 다음과 같은 방법

Map<account.getId(), account> 

적절한 계정 개체를 검색하려면 "GET"방법을 사용할 수 있습니다 그것을 구현할 수 있습니다.

accountMap.get(id);