2016-01-10 5 views
0

Я нашел алгоритм, содержащий метод слияния (https://commons.apache.org/proper/commons-math/jacoco/org.apache.commons.math3.stat.clustering/DBSCANClusterer.java.html)Слияние двух списков. Sens использования HashSet

private <T> List<T> theirMerge(final List<T> one, final List<T> two) { 
    final Set<T> oneSet = new HashSet<T>(one); 
    for (T item : two) { 
     if (!oneSet.contains(item)) { 
      one.add(item); 
     } 
    } 
    return one; 
} 

Что является основным преимуществом использования HashSet здесь?

Моя проще реализация выглядит следующим образом

private <T> List<T> myMerge (ArrayList<T> one, ArrayList<T> two){ 
    for (T item: two) { 
     if(!one.contains(item)){ 
      one.add(item); 
     } 
    } 
    return one; 
} 
+3

Dupe of: http://stackoverflow.com/questions/1035008/what-is-the-difference-between-set-and-list – Tunaki

+0

Я знаю разницу. Но почему я предпочитаю использовать вышеупомянутую версию? Просто чтобы смешать заказ? – froehli

+1

из-за производительности (если заказ не важен), см. Http://stackoverflow.com/questions/18706870/java-hashset-vs-array-performance – wero

ответ

0

Вы должны избегать петель и использовать addAll метод для слияния двух set и избежать дубликатов, как:

oneSet.addAll(two); 

В то время как в списке вы явно проверки, является ли дон 't есть элемент в list, а затем только вы добавляете ко второму списку.

+0

Вы имеете в виду создание двух наборов из списков, а затем вызов addAll, а затем преобразуя его обратно в список? – froehli

+0

Вы уже создали 'oneSet', поэтому добавьте все элементы из' two' к нему и верните это (или создайте другой список, который вы хотите вернуть). – SMA

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