проблема с Java collection framework

#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 с коллекциями. метод сортировки?