#java #frameworks #collections
#java #фреймворки #Коллекции
Вопрос:
Я изучаю collection на Java и застрял, понимая следующее.Взято из scjp Халидом Моголом (обзорный вопрос 15.37)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class WhatIsThis {
public static void main(String[] args) {
List<StringBuilder> list = new ArrayList<StringBuilder>();
list.add(new StringBuilder("B"));
list.add(new StringBuilder("A"));
list.add(new StringBuilder("C"));
Collections.sort(list, Collections.reverseOrder());
System.out.println(list.subList(1,2));
}
}
Выберите один правильный ответ.
a. Программа скомпилирует и напечатает следующее при запуске: [B].
b. Программа скомпилирует и напечатает следующее при запуске: [B, A].
c. Программа скомпилирует, но выдаст исключение при запуске.
d. Программа не будет компилироваться.
Ниже приведен ответ-
(c) Класс StringBuilder не реализует сопоставимый интерфейс. Метод sort(), который использует компаратор, не предъявляет никаких таких требований к типу элемента. Программа компилируется, но выдает ClassCastException, поскольку объекты-конструкторы строк не могут сравниваться в обратном естественном порядке.
Я не могу понять ответ, пожалуйста.Кто-нибудь может мне помочь, пожалуйста?
Ответ №1:
Вы просмотрели документацию для Collections.sort
?
Сортирует указанный список в порядке возрастания в соответствии с естественным порядком расположения его элементов. Все элементы в списке должны реализовывать сопоставимый интерфейс. Кроме того, все элементы в списке должны быть взаимно сопоставимы (то есть e1.compareTo(e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в списке).
и
Выдает:
Исключение ClassCastException — если список содержит элементы, которые не являются взаимно сопоставимыми (например, строки и целые числа).
Это вам помогает? В принципе, для сортировки списка sort
приходится сравнивать StringBuilder
значения друг с другом — а в StringBuilder
нет естественного сравнения.
Комментарии:
1. Спасибо. Я не проверял документ (я немного ленив, и документ мне кажется сложным :)). Что я понял, так это то, что StringBuilder переопределяет equals,hascode, но не compareto, и в этом проблема. Что касается «Сортировки указанного списка в порядке возрастания в соответствии с естественным порядком его элементов» — за исключением строки и чисел, как этот порядок возрастания будет реализован для других объектов? Я предполагаю, что этот класс должен переопределять метод compareto?
Ответ №2:
Список содержит объекты, тип которых — StringBuilder.
При попытке сортировки методу sort необходимо сравнить элементы, чтобы определить порядок, он делает это, рассматривая элементы как сопоставимые, он попытается привести их к типу Comparable. Поскольку String Builder не реализует этот интерфейс, приведение завершится ошибкой и будет выдано исключение.
Комментарии:
1. спасибо, значит, это исключительный класс, который переопределяет equals, hascode, но не comapreto?
2. и поэтому вы не можете отсортировать список, содержащий объекты stringbuilder с коллекциями. метод сортировки?