2012-05-09 4 views
0

목록이 있고 그 중 하나 (고유 한) 특성 만 알고있는 클래스 요소를 찾으려고합니다. 목록 검색

public static List<Achievement> listAchievements; 
String idAchievement = "5764e35"; 

분명히
listAchievements.indexOf(idAchievement); 

작동하지 어느 쪽이

Achievement ach(idAchievement); 
listAchievements.getIndexOf(ach); 

이며이 아니다 당신은 단지 목록이있는 경우 해결 방법

for (Achievement achievement : listAchievements) { 
     if (achievement.resourceID().equalsIgnoreCase(idAchievement)) { 
      // STUFF 
      break; 
     } 
    } 
+4

그리고 질문은 무엇입니까? "다른 데이터 구조"(http://docs.oracle.com/javase/7/docs/api/java/util/Map.html)를 사용하지 않는 한 "해결 방법"은 거의 유일한 옵션입니다.). –

+0

java의 List 인터페이스에 getIndexOf (Object obj) 메소드가 있는지 궁금합니다. – dharam

+0

올바른 메소드 이름은 indexOf입니다. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/List.html#indexOf%28java.lang.Object%29 –

답변

8

해결 방법이 아니므로 해결책입니다.

람다와 비슷한 동작으로 이것을 요약 할 수는 있지만 결국에는 주어진 속성을 가진 요소에 대한 목록을 검색하려고하면 할 수있는 것이 없지만 해당 속성을 가진 요소를 찾을 때까지 목록을 반복합니다.

ID로 찾기를 더 직접 찾으려면 Map<String,Achievement>이 고유 한 ID 인 경우 더 나은 선택 일 수 있습니다.

+0

대부분 정확합니다. 그것이 외부 라이브러리가 작업하게 해주었 기 때문에 목록을 사용하고있었습니다. –

+0

@EfEs Vipul의 대답에 주목할 가치가 있습니다. 리스트가 당신이 원하는 순서대로 있다고 가정했는데 그것은 ID 순서가 아닙니다. 그러나 목록을 주문할 수 있다면 이진 검색으로 연결될 수 있습니다. 그러나 목록을 정렬하는 데 오버 헤드가 있으므로 한 번 정렬 한 다음 여러 번 검색 할 수 있다면이 방법이 가장 좋습니다. 검색 당 정렬을 수행해야하는 경우 유용하지 않습니다. – yshavit

0

꽤하지 않습니다되지 않는다 훨씬 더 할 일. 그러나이 작업이 자주 수행되는 경우 HashMap 또는 이와 유사한 방법을 대신 (업적에서 업적으로) 고려하는 것이 좋습니다.

0

이러한 효율성을 높이려면 idAchievement의 Map을 Achievement에 사용하거나 컬렉션을 idAchievement 속성으로 정렬 한 다음 Collections.binarySearch()를 사용해야합니다.

4

원하는 요소를 찾을 때까지 요소를 반복하는 것 외에 다른 방법은 없습니다. Guava가 술어에 대한 지원을 사용할 수 있습니다.

Achievement a = Iterables.find(list, new Predicate<Achievement>() { 
    @Override 
    public boolean apply(Achievement input) { 
     return input.resourceID().equalsIgnoreCase(idAchievement) 
    } 
}); 

그러나 최종 결과는 같습니다.

또는 목록 대신 Map<String, Achievement>을 별도로 유지하거나 목록 대신 LinkedHashMap<String, Achievement>을 사용하여 O (n) 대신 O (1) 검색을 수행 할 수 있습니다.

+0

나는 당신의 답변이 매우 유익하기 때문에 당신과 yshavit 사이의 "정확한"부분을 나누고 싶다. 그러나 그는 카르마를 덜 갖기 때문에 그는 그것을 얻는다. 어쨌든 당신을 업 그레 이드. –

2

1) 정적 void sort (List, Comparator)를 사용하여 목록을 정렬해야합니다.
2) static int binarySearch (List, Key, Comparator)를 사용합니다.

두 가지 방법은 java.util.Collections입니다.

+0

Android는 Android와 호환됩니까? –

+0

@Ff Es .... 잘 모르겠습니다. – Vipul