2014-10-16 2 views
0

есть ли способ, как конвертировать List<MyClass> в TreeMap<Long, MyClass> с разумной производительности? Я нашел метод Maps.uniqueIndex() в Google Collections, но он возвращает только Map.Java Список <MyClass> в TreeMap <Long, MyClass>

Список может быть уничтожен во время процесса преобразования, мне нужно просто TreeMap. Я использую TreeMap, потому что мне нужен быстрый поиск и индексация с длинным.

Заранее спасибо

+0

также операции 'put',' 'get', remove' (и другие) класса' TreeMap' имеют временную сложность O (§ п), вы всегда будете закончите с временной сложностью O (n log n) для любого алгоритма преобразования. Использование «HashMap» намного лучше, если вы хотите «быстрый поиск». – Seelenvirtuose

ответ

2

Существует не проще, чем метод итерации.

Map<Long, MyClass> tree = new HashMap<Long, MyClass>(); 
for (MyClass cl: classList){ 
    tree.put(cl.getId(), cl); 
} 

Как Seelenvirtuose упоминалось: Если вы хотите найти производительность: HashMap, если вы хотите, чтобы ваши элементы должны быть отсортированы использовать TreeMap. В результатах поиска идет HashMap.

+0

Сложность времени этой простой итерации _is not_ O (n), это O (n log n). Сама итерация является obvioiusly O (n), но вы забыли считать, что «TreeMap.put» имеет временную сложность O (log n). Вместе это O (n log n). – Seelenvirtuose

+0

О, спасибо за эту информацию :) Запомните это :) – Beri

+0

И поскольку OP запросил «быстрый поиск и индексацию», вы также должны рассмотреть возможность использования 'HashMap' вместо' TreeMap'. – Seelenvirtuose

1

В Java 8 использование потока API для наиболее простым способом:

Map<Long, MyClass> map = myClassList.stream().collect(Collectors.toMap(MyClass::getId, c -> c)); 

Как ухаживать за Efficency, вы должны использовать HashMap вместо TreeMap. Определение реализации Map выглядит следующим образом:

Map<Long, MyClass> map = myClassList.stream() 
     .collect(HashMap::new, (map, myClass) -> map.put(myClass.getId(), myClass), HashMap::putAll); 
Смежные вопросы