2012-05-14 2 views
3

Предположим, приложение продуцирующие ряд HashMap<String, MyClass> структур данных, каждый из которых содержит от десятков до сотен Comparable объектов типа MyClass, которые должны в конечном итоге в один и отсортированных Collection.SortedSet или сортируется Коллекция

Два возможных реализаций этой функции возвращают SortedSet или отсортированный список, следующим образом:

public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps) 
{ 
    SortedSet<MyClass> set = new TreeSet<MyClass>(); 

    Collection<MyClass> c; 

    for (HashMap<String, MyClass> map:allMaps) 
    { 
     c = map.values(); 
     set.addAll(c); 
    } 

    return set; 
} 

public static List<MyClass> getSortedList(HashMap<String, MyClass>... allMaps) 
{ 
    List<MyClass> list = new ArrayList<MyClass>(); 

    Collection<MyClass> c; 

    for (HashMap<String, MyClass> map:allMaps) 
    { 
     c = map.values(); 
     list.addAll(c); 
    } 

    Collections.sort(list); 

    return list; 
} 

Будет ли какой-либо явное преимущество в производительности для любого из вышеуказанных 2 методов?

Есть ли более быстрый способ реализации одной и той же функциональности?

+5

Если вам интересно, что быстрее, почему бы не измерить их по фактическим данным? – NPE

+0

Потому что кто-то еще собирается использовать этот код! Все, о чем я прошу, заключается в том, есть ли серьезная причина для того, чтобы одна реализация или другая была быстрее! – PNS

+0

Вы все еще можете выполнить нагрузочный тест, чтобы узнать лучшую производительность ... –

ответ

4

Некоторые проблемы с вашим отсортированный методом списка:

ArrayLists подкреплены массивами. Всякий раз, когда вы добавляете новый элемент, ему может потребоваться расширить массив за кулисами. Если вы хотите использовать этот подход, вы должны создать ArrayList соответствующего размера перед началом работы.

Сортировка после добавления всех элементов кажется неоптимальной. Почему бы не добавить элементы в список в правильном положении? (Используйте отсортированную коллекцию, затем превратите ее в список) A good Sorted List for Java

Чтобы ответить на ваш вопрос, я бы пошел с подходом, который использует TreeSet за кулисами. Потому что, если пользователь хочет, они всегда могут делать Set.toArray(), а затем иметь список.

+0

Это похоже на http://stackoverflow.com/questions/6971152/list-with-comparable-vs-treeset. Общее решение для преобразования из Set to List можно найти по адресу http://stackoverflow.com/questions/740299/how-do-i-sort-a-set-to-a-list-in-java. Благодаря! – PNS

1

Наборы и списки отличаются по своей природе в том смысле, что наборы не содержат дубликатов. У вас может быть только один экземпляр объекта. Списки позволяют сохранять дубликаты.

Как таковые, наборы больше работают, следовательно, они медленнее.

+0

Конечно, но допустим, что дубликатов нет. Есть ли основания предполагать, что одна реализация будет всегда быстрее другой? – PNS

+0

Возможно, речь идет не о дубликатах, а о инструкциях, чтобы проверить, что элемент еще не присутствует в наборе. Таким образом, ответ по-прежнему применяется. – Carlo

+1

@PNS см. Ниже Колин D. Использование TreeSet и позволяет пользователю получить массив при необходимости - хороший подход. –

2

Есть ли основания предполагать, что одна реализация будет всегда быстрее другой?

Нет, нет оснований предполагать это.

Что быстрее может зависеть от количества данных, по своим свойствам от характеристик компаратора, на ваш JDK, на JIT компилятор и т.д.

Единственный способ узнать наверняка, является сравнивая код с реалистичными данными.

+0

Кто-то указал на http://stackoverflow.com/questions/6971152/list-with-comparable-vs-treeset, но затем удалил комментарий. Кажется, что TreeSet действительно быстрее. – PNS

+0

@PNS: Это другая проблема (они сортируют список после каждой вставки, тогда как вы только сортируете в конце). – NPE

Смежные вопросы