Подтвердить что ты не робот

Общий метод для поиска медианы из 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);
}
4b9b3361

Ответ 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(), а затем вручную добавить к нему элементы.