Общий метод для поиска медианы из 3 значений
Мне нужен был метод, чтобы получить медиану из трех значений, я подумал, что это хорошая возможность написать общий метод, поскольку на самом деле я не занимаюсь этим. Я написал это, и это выглядит довольно прямолинейно, хотя я получаю предупреждение, но, похоже, он работает нормально, согласно моим тестам.
Я знаю, что я мог бы использовать отсортированный по умолчанию набор или Collections.sort()
, но этот подход для понимания.
Я хочу выделить несколько вещей:
- Я заметил, что это не работает, если я пытался объявить
medianHelper
с Arrays.asList(a, b, c)
, почему это? Попытка поиска это дает мне несвязанные результаты, и это в противном случае неуловимо, так как я не уверен, что происходит. Я получаю UnsupportedOperationException
, но этого нет, как показано ниже.
- Почему я получаю предупреждение? Что не так/не хватает?
Метод следует:
private static <T extends Comparable> T median(T a, T b, T c) {
List<T> medianHelper = new ArrayList<>();
T max;
T min;
medianHelper.add(a);
medianHelper.add(b);
medianHelper.add(c);
if (a.compareTo(b) >= 0) {
max = a;
min = b;
} else {
max = b;
min = a;
}
if (max.compareTo(c) == -1) {
max = c;
}
if (min.compareTo(c) >= 0) {
min = c;
}
medianHelper.remove(max);
medianHelper.remove(min);
return medianHelper.get(0);
}
Ответы
Ответ 1
Неправильно введен параметр типа T
, так как Comparable
тоже является общим.
Это должно быть:
private static <T extends Comparable<? super T>> T median(T a, T b, T c)
Кроме того, вы можете просто сортировать список medianHelper
, так как его элементы будут be Comparable
. Таким образом, ваш метод может быть значительно сокращен до:
private static <T extends Comparable<? super T>> T median(T a, T b, T c) {
List<T> medianHelper = Arrays.asList(a, b, c);
Collections.sort(medianHelper);
return medianHelper.get(1);
}
Обратите внимание, что Arrays.asList()
возвращает немодифицируемый список, что означает, что вам не разрешено добавлять/удалять элементы после его создания. Если вы хотите выполнить сравнения самостоятельно, вы можете использовать new ArrayList<>
вместо Arrays.asList()
, а затем вручную добавить к нему элементы.