У меня есть несколько Comparator
с - один для Date
с, один для знаков после запятой, один за проценты и т.д.Как я могу улучшить этот компаратор?
В первом моем десятичном компараторе выглядел следующим образом:
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1 = Double.parseDouble(s1);
final Double i2 = Double.parseDouble(s2);
return i1.compareTo(i2);
}
}
Жизнь была проста , Конечно, это не относится к случаю, когда строки не обрабатываются. Таким образом, я улучшил compare()
:
class NumericComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
final Double i1;
final Double i2;
try {
i1 = Double.parseDouble(s1);
} catch (NumberFormatException e) {
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e2) {
return 0;
}
return -1;
}
try {
i2 = Double.parseDouble(s2);
} catch (NumberFormatException e) {
return 1;
}
return i1.compareTo(i2);
}
}
Жизнь была лучше. Испытания стали более твердыми. Однако мой обозреватель моего кода отметил: «А как насчет null
?»
Великий, так что теперь я должен повторить выше NullPointerException
или предварять тело метода с:
if (s1 == null) {
if (s2 == null) {
return 0;
} else {
return -1;
}
} else if (s2 == null) {
return 1;
}
Этот метод огромен. Хуже всего, мне нужно повторить этот шаблон с тремя другими классами, которые сравнивают различные типы строк и могут поднять три других исключения при разборе.
Я не эксперт по Java. Есть ли более чистый, более чистый раствор, чем - gasp - копирование и склеивание? Должен ли я торговать правильностью из-за отсутствия сложности, если она документально подтверждена?
Update: Некоторые предположили, что это не задание Comparator
«s для обработки null
значений. Поскольку результаты сортировки отображаются пользователям, я действительно хочу, чтобы нули сортировались последовательно.
Хотелось бы узнать, почему вам нужны компараторы, которые обрабатывают все возможные сценарии без ошибок. что вы делаете, мне кажется, что это маскирование ошибок, которое не помогает в большинстве ситуаций. – pstanton
Простите меня, если я неправильно понял код, вы говорите, что s1 и s2 равны, если ни один из них не может быть проанализирован? Это кажется немного странным ... – Grundlefleck
Что касается маскировки ошибок, эти классы предназначены для сортировки столбцов в таблице GWT. С точки зрения пользователя это должно быть «достаточно хорошим». Что касается равенства, то да, если ни одна строка не обрабатывается, ни одна строка не сопоставима. Таким образом, они равны в своей нерушимости. –