2016-08-22 5 views
0

Есть ли лучший способ сортировки коллекции в Java-8 без проверки сначала, если коллекция пуста или null?Java-8 сортировать коллекцию

if (institutions != null && !institutions.isEmpty()) { 
     Collections.sort(institutions); 
    } 
+7

Там нет необходимости проверять пустую коллекцию на всех. Лучше избегать проверки «null», никогда не позволяя коллекции быть «нулевой» в первую очередь. – Holger

ответ

0

я могу думать только 3 (4) способами:

  1. Используйте SortedSet (например TreeSet) и вставить его там. Элементы будут отсортированы сразу, однако время ввода может быть плохим. Кроме того, вы не можете иметь равные элементы (например, 3x 1), поэтому это может быть не лучшее решение.

Тогда есть обычный Collections.sort(). Вам не нужно проверять, что ваш список пуст, однако вам нужно убедиться, что он не является нулевым. Честно говоря, разве у вас когда-либо был прецедент, когда ваш список пуст, и вы хотите его отсортировать? Похоже, это может быть проблема дизайна.

Наконец, вы можете использовать потоки для возврата отсортированных потоков. Я написал небольшой тест, который измеряет время этого:

public static void main(String[] args) { 
     List<Integer> t1 = new ArrayList<>(); 
     List<Integer> t2 = new ArrayList<>(); 
     List<Integer> t3 = new ArrayList<>(); 
     for(int i = 0; i< 100_000_00; i++) { 
      int tmp = new Random().nextInt(); 
      t1.add(tmp); 
      t2.add(tmp); 
      t3.add(tmp); 
     } 

     long start = System.currentTimeMillis(); 
     t1.sort(null); // equivalent to Collections.sort() - in place sort 
     System.out.println("T1 Took: " + (System.currentTimeMillis() - start)); 

     start = System.currentTimeMillis(); 
     List<Integer> sortedT2 = t2.stream().sorted().collect(Collectors.toList()); 
     System.out.println("T2 Took: " + (System.currentTimeMillis() - start)); 

     start = System.currentTimeMillis(); 
     List<Integer> sortedT3 = t3.parallelStream().sorted().collect(Collectors.toList()); 
     System.out.println("T3 Took: " + (System.currentTimeMillis() - start)); 
    } 

Сортировка случайных целых чисел результаты: (на мой ящик, очевидно)

Collections.sort() -> 4163 
stream.sorted() -> 4485 
parallelStream().sorted() -> 1620 

Несколько пунктов:

Collections.sort() и List # сортируют существующий список на месте. API потоковой передачи (как параллельный, так и обычный) создаст новые отсортированные списки.

Снова - поток может быть пустым, но он не может быть пустым. Похоже, что параллельные потоки являются самыми быстрыми, однако вы должны иметь в виду подводные камни параллельных потоков. Прочтите некоторую информацию, например. здесь: Should I always use a parallel stream when possible?

Наконец, если вы хотите, прежде чем проверить нуль, вы можете написать свой собственный статический помощник, например:

public static <T extends Comparable<? super T>> void saveSort(final List<T> myList) { 
     if(myList != null) { 
      myList.sort(null); 
     } 
    } 

    public static <T> void saveSort(final List<T> myList, Comparator<T> comparator) { 
     if(myList != null) { 
      myList.sort(comparator); 
     } 
    } 

Я надеюсь, что помогает!

Edit: Еще Java8 преимуществом для сортировки является обеспечение вашего компаратора, как лямбда:

+0

Можно заметить, что 'Collections.sort' и' List.sort' сортируются на месте, а 'stream' -решения создают отсортированную копию (которая отбрасывается в вашем коде). –

+0

@tobias_k спасибо, я принял свой ответ, чтобы отразить эти моменты. – pandaadb

+2

Трудно найти два предложения, которые на самом деле отвечают на вопрос в этом длинном ответе, говоря о вещах, которые никогда не просили ... – Holger

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