2015-12-01 4 views
0

Я должен изменить существующий код, указанный код возвращает список объектов Obj:Есть ли способ сделать List.addAll элементов сортировки нужно для поиска

public class Obj{ 
    ...fields... 
    private String label; //the field the search is performed on 
} 

от вызова службы и помещает его внутри ArrayList: Список retrievedList = ..service call ... finalList.addAll (retriedList);

Впоследствии некоторые клиенты могут попросить меня найти Obj с определенным ярлыком, сейчас поиск плохо сделано так:

for(Obj o :finalList){ 
    if(o.getLabel().equals(label){ 
     return o; 
    else 
     ... 

Есть около 100,000 Obj экземпляров в этом списке, поэтому поиск не эффективно.

Моя идея состоит в том, чтобы сначала создать класс Obj с помощью компаратора на основе метки, а затем сделать так, чтобы метод addAll относил этот компаратор таким образом, упорядочивая объекты на основе поля метки. Впоследствии реализует что-то вроде quickSort или использует более эффективную конструкцию, если Guava предоставляет любой. У вас есть идеи?

+2

Как насчет Collections.sort (ваш список, новый yourComparator())? – user3232446

+0

Используйте метод contains из этого списка, чтобы найти объект. Вам придется переопределить hashcode и equals. Определите «бизнес-(первичный) ключ» (не идентификатор базы данных), например «номер счета или« адрес электронной почты », который является уникальным для ваших объектов, и используйте его в hashcode и равным. – Stefan

+0

@ user3232446 - ему придется вызвать сортировку после каждой модификации к списку (или, что еще хуже, до его запроса). Неэффективно – TheLostMind

ответ

0

Гуава, предоставленная TreeMultiset, будет соответствовать вашим потребностям. Этот тип коллекции поддерживает добавление нескольких значений элемента (в вашем случае я предполагаю, что несколько объектов могут иметь одну и ту же метку) с помощью специализированного компаратора и реализует интерфейс Collection. Это также сортированная коллекция, а операции добавления/удаления/поиска очень эффективны, так как она использует структуру данных дерева.

Поиск элементов может быть выполнен с использованием метода subMultiset, который будет возвращать все элементы в указанном диапазоне.