2016-06-16 2 views
0

Любое предлагает простое объяснение того, как этот список сортируется и почему код в анонимной функции работает, чтобы первый элемент отсортированного списка всегда был последним лексикографическим словом вверху. Я понимаю, что если CompareTo возвращает -1 0 и 1 по сравнению, но код, кажется, подразумевает, что параметры o1 и o2 можно сравнить одновременно ...Анонимные функции Collections.sort java

List<String> allNames = new ArrayList<>(); 
allNames("Alfred"); 
allNames("Mary"); 
allNames("Hilda"); 
allNames("Zenda"); 
allNames("Thomas"); 
allNames("Isabel"); 



Collections.sort(allNames, new Comparator<String>() { 
@Override 
public int compare(String o1, String o2) { 

if (o1.equals("Zenda") && !o2.equals("Zenda")){ 

return -1; 

} else if (o2.equals("Zenda") && !o1.equals("Zenda")){ 

return 1 ; 
} 

return o1.compareTo(o2); 
} 
}); 

ответ

0

Они положили в специальной обработке, так что Zenda всегда сортируется перед чем-либо еще, проверяя значение и жесткое кодирование -1 или 1 в случае, когда zenda является первым или вторым термином, соответственно, затем они делегируют оставшуюся часть заказа регулярной реализации сравнения строк.

1

Comparator.compare похож на Comparable.compareTo. Они выполняют одну и ту же функцию, более или менее, но чем отличается объект, выполняющий сравнение. compareTo позволяет объекту сравнивать себя с другим объектом, а compare используется сторонним объектом для сравнения двух других объектов.

Анонимный Comparator здесь сравнивает два String s, o1 и o2. Если o1 должен прибыть до o2, он возвращает -1. Иначе, если o2 должен прибыть до o1, 1.

Что особенного в вашем анонимном Comparator является то, что он гарантирует, что "Zenda" всегда считается первым.

+0

Но означает ли это, что o1 и o2 могут быть одним и тем же объектом? Как представляется, код, похоже, ищет равные по двум аргументам в тех же условных операторах If? – DevelopeXCode

+0

Они могут быть, конечно. Первые условные проверки, если «o1» - «Zenda» и «o2», не являются «Zenda», а второй условный - наоборот. Например, если они были «Zenda», то возникает условие «else». 'o1.compareTo (o2)' будет возвращать '0', если они являются одним и тем же объектом, который сообщает методу сортировки, что относительный порядок этих двух объектов не имеет значения (потому что они одинаковы). – Zircon

+0

Не смысл быть придирчивым, но кто-нибудь знает, какой алгоритм используется, чтобы я мог визуализировать реализацию. Что происходит за кулисами, если легко объяснить ... – DevelopeXCode

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