2015-01-28 2 views
0

Я знаю, как сортировать объекты любого типа с помощью Comparator и Collections.sort(), но я хочу знать, как я могу использовать Arrays.parallelSort() для сортировки списка Карт? так как он способен сортировать только обычные массивы.Как использовать parallelSort() Java 8 для сортировки списка карт

Это мой код для сортировки с помощью Comparator,

List<Map<String, Integer>> employees = new ArrayList<Map<String, Integer>>() {{ 
    add(new HashMap<String, Integer>() {{put("position",5); put("id2", 9);}}); 
    add(new HashMap<String, Integer>() {{put("position",1); put("id2", 1);}}); 
    add(new HashMap<String, Integer>() {{put("position",2); put("id2", 2);}}); 
    add(new HashMap<String, Integer>() {{put("position",4); put("id2", 5);}}); 
    add(new HashMap<String, Integer>() {{put("position",1); put("id2", 1);}}); 
    add(new HashMap<String, Integer>() {{put("position",4); put("id2", 7);}}); 
}}; 

Comparator<Map<String, Integer>> comparator = new Comparator<Map<String, Integer>>() { 
     @Override 
     public int compare(Map<String, Integer> o1,Map<String, Integer> o2) { 
       int nr1 = o1.get("id2"); 
       int nr2 = o2.get("id2"); 
       return Integer.compare(nr2, nr1); 
     } 
}; 

Collections.sort(employees,comparator); 

for (Map<String, Integer> s : employees){ 
    System.out.println(s); 
} 

Arrays.parallelSort имеет метод, называемый parallelSort(T[] a,Comparator<?super T> c), но я не знаю, как правильно его использовать.

Я попытался это до сих пор,

Arrays.parallelSort(new ArrayList<Map<String, Integer>>(employees.size()), comparator); 

Ofcourse Я получаю эту ошибку,

The method parallelSort(T[], Comparator<? super T>) in the type Arrays is not applicable for the arguments (ArrayList<Map<String,Integer>>, Comparator<Map<String,Integer>>) 

Я просто любопытно, если такой тип данных может быть отсортирован с помощью parallelSort?

P.S: Я также знаю, как использовать Java 8 stream().sorted для сортировки, но я не хочу его использовать.

Редактировать: Я сортирую id2 в порядке убывания.

+0

Я думаю, что этот пост может вам помочь: [здесь] (http://stackoverflow.com/questions/25961018/sorting-a-list-in-parallel-without-creating-a-temporary-array-in-java -8) –

ответ

2

Для конкретного примера, что вы показываете в вашем вопросе, вы могли бы просто написать:

employees.parallelStream() 
     .sorted((m1, m2) -> Integer.compare(m2.get("id2"), m1.get("id2"))) 
     .forEachOrdered(System.out::println); 

Но обратите внимание, что это будет, вероятно, назвать Arrays#parallelSort в фоновом режиме.

+2

'Comparator.comparing (m -> m.get (" id2 ")). Reverseed()' – aioobe

+0

зачем писать его 'Arrays # parallelSort', как это, а не как' Arrays.parallelSort', когда обсуждаете методы? – bhuvesh

+0

@assylias Я пробовал ваш код, но он всегда дает так много ошибок, 'm1 не может быть разрешен переменной' ...' m2 не может быть разрешено переменной', а на 'System.out :: println' он дает' Синтаксис ошибка на токенах, удаление этих токенов – bhuvesh