2010-07-27 6 views
1

개체의 ArrayList에 대해 빠른 검색을 구현하고 싶습니다. 이러한 객체는 int oldId, int newId 및 int inList로 구성됩니다.arrayList의 두 키를 사용하여 검색

내 목록에서 Collections.binarySearch를 사용하여 이진 검색을 구현하려고 시도했지만 문제는 해당 객체에서 newId를 가져 오기 위해 oldId 및 inList를 사용하여 검색해야한다는 것입니다. 예 : oldId = 9 및 inList = 1을 가지고 다른 곳에 할당 된 newId를 얻으려고합니다. 기본적으로 oldId-newId를 매핑하여 그룹화했습니다. oldId가 중복 될 수 있지만 서로 다른 목록에 있어야하며 고유 한 newIds가 있어야합니다.

지도 개체에 해시 맵을 사용하는 것이 더 좋을 것이라고 생각하십니까? 그렇지 않으면 oldId 및 inList 정보에서 newId를 가져 오는 솔루션 (객체의 비교 자일 수도 있음)이 있습니까? 나는 또한 빠른 검색 알고리즘을 찾고있다.

도움을 많이 주셔서 감사합니다.

여기에 바이너리 검색을 위해 작성한 비교기가 있지만 여기에 inList 정보를 추가하는 방법을 알 수는 없습니다. {

public CompareTermId(){} 

public int compare(MObj a, MObj b){ 

    if(a.oldTermId < b.oldTermId) return 1; 
    else if(a.oldTermId > b.oldTermId) return -1; 
    else return 0; 
} 

}

답변

1

.

다음과 같이 해시 맵을 구성하는 경우 : 다음

Map<Id, Map<InList, Id>> oldIdToNewIdMap = new HashMap<>(); 

을 그리고 채 웁니다 :

Map<InList, Id> inListMap = new HashMap<>(); 
inListMap.put(oldId, newId); 
oldIdToNewIdMap.put(inList, inListMap); 

다음과 같이 그럼 당신은 조회 수 :

Id newId = oldIdToNewIdMap.get(inList).get(oldId); 
0

public class CompareTermId implements Comparator<MObj> 나는 하나의 클래스로 모두를 캡슐화하고 그들을 찾을 목록 및 비교기를 사용하는 것이 좋을 것 같아요.

0

당신이 할 경우,이처럼 비교기의 모양을

public int compare(MObj a, MObj b) { 
    if (a.oldTermId < b.oldTermId) return 1; 
    else if (a.oldTermId > b.oldTermId) return -1; 
    else if (a.inList < b.inList) return 1; 
    else if (a.inList > b.inList) return -1; 
    else return 0; 
} 

하는 당신은 심지어 binarySearch 방법을 사용하기 위해, 황금해야한다. 이 콤퍼레이터는 먼저 oldTermId로 항목을 정렬 한 다음 inList 값으로 항목을 정렬하므로 동일한 oldID와 다른 inList 값을 가진 두 항목이 다르게 간주됩니다. 당신은 내가 HashMap의는 하나의 키에 대해 효율적으로 일정 시간 조회를 제공하기 때문에

이유는 :)의 HashMap를 추천하기 위하여려고하고 초대로

관련 문제