Вы задаете разные вопросы в заголовке вопроса и в теле вопроса.
Вы не знаете, почему функция с поддержкой исключений, используемая методом compare()
, выдает исключение.Это либо потому, что в коллекции есть определенные несопоставимые объекты (например, NaN
числовое значение), либо потому, что существуют определенные пары объектов, которые нельзя сравнивать друг с другом.
Почему можноя выбрасываю исключение в Comparator?
Я думаю, Comparator.compare()
не предназначен для создания проверенного исключения, потому что:
этоПредполагается, что любые элементы, которые вы хотите сравнить / отсортировать, всегда будут сопоставимы.
, если Comparator.compare()
может вызвать какое-то ожидаемое (то есть проверенное) исключение, тогда я могу представитьпара нежелательных сценариев:
a.сортировка может быть прервана, потому что там находится какой-то несопоставимый объект - вероятным ответом будет удаление несопоставимых объектов и повторная попытка сортировки
b.множественные сортировки в разных порядках одного и того же набора объектов могут иногда прерываться с исключением, а иногда и успешно, в зависимости от того, выпала ли пара несопоставимых объектов для сравнения во время сортировки
Это, конечно, только моя гипотеза.
Как бы я решил это?
Я собираюсь предположить, что причина, по которой функция-исключение, которую использует Comparator.compare()
, генерирует исключение, заключается в том, что в коллекции есть несопоставимый объект (например, числовое значение NaN
).Возможные варианты:
Сортировать копию списка с удаленными несопоставимыми объектами.
Бросить непроверенное (во время выполнения) исключение впрервать сортировку.Не уверен, что вы будете делать тогда, кроме # 1 выше.
Следуйте подходу NaN
и сделайте так, чтобы эти объекты появлялись в начале или в конце.
NaN
значения обычно несопоставимы с другими значениями, но во время сортировки компаратор определяет свой собственный общий порядок, так что значения NaN
заканчиваются в конце отсортированной коллекции.
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Arrays.html#sort(double[])
... Отношение <не обеспечивает полный порядок для всех значений с плавающей точкой;... значение NaN сравнивается не меньше, не больше, не равно и не равно какому-либо значению с плавающей запятой, даже самому себе. </p>
... Чтобы разрешить продолжение сортировки, ... этот метод использует итоговое значениепорядок, налагаемый Double.compareTo (java.lang.Double).
... Этот порядок отличается от отношения <тем, что ... NaN считается больше, чем любое другое значение с плавающей запятой.Для целей сортировки все значения NaN считаются эквивалентными и равными. </p>
Для этого кодируйте Comparator.compare()
так, чтобы любой несравненный объект всегда сравнивался с большим значением, чем любой сопоставимый объект, и всегда сравнивался равнымк любому другому несравненному объекту.