Поиск с использованием двух ключей в arrayList - PullRequest
1 голос
/ 27 июля 2010

Я хотел бы реализовать быстрый поиск по ArrayList объектов. Эти объекты состоят из int oldId, int newId и int inList, наряду с другими вещами.

Теперь я попытался реализовать бинарный поиск с использованием Collections.binarySearch в моем списке, но проблема в том, что мне нужно искать, используя oldId и inList, чтобы получить newId из соответствующего объекта. Пример: у меня oldId = 9 и inList = 1, и я пытаюсь получить newId, который был назначен где-то еще. По существу сопоставил oldId-newId и сгруппировал их. Там могут быть дубликаты старых идентификаторов, но они должны быть в разных списках и иметь уникальные новые идентификаторы.

Как вы думаете, было бы лучше использовать hashmap для этих объектов карты? Или же, есть ли решение (может быть, компаратор для объектов), чтобы получить newId из информации oldId и inList. Я также ищу быстрый алгоритм поиска.

Большое спасибо за помощь, я ценю идеи.

Вот компаратор, который я написал для бинарного поиска, однако я не мог понять, как добавить сюда информацию inList.

public class CompareTermId implements Comparator <MObj> {

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;
}

}

Ответы [ 3 ]

1 голос
/ 27 июля 2010

Как вы уже пригласили, я порекомендую HashMap:)

Причина в том, что HashMap эффективно обеспечивает поиск по постоянному времени для одного ключа.

Если вы строите карту хеша следующим образом:

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 голосов
/ 27 июля 2010

Если вы сделаете свой компаратор похожим на это:

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 будут считаться разными.

0 голосов
/ 27 июля 2010

Я думаю, что было бы лучше объединить все это в один класс и использовать List и Comparator, чтобы найти их.

...