java - 寻找 3 个值的中位数的通用方法

标签 java sorting generics median

我需要一种方法来获取 3 个值的中位数,我认为这是编写通用方法的好机会,因为我并没有真正实践过。我写了这个,它看起来很简单,虽然我收到警告,但根据我的测试,它似乎工作正常。

我知道我可以使用固有排序集或 Collections.sort(),但这种方法是为了便于理解。

我想指出几点:

  1. 我注意到,如果我尝试使用 Arrays.asList(a, b, c) 声明 medianHelper,这将不起作用,这是为什么?尝试搜索它会给我不相关的结果,而且由于我不确定发生了什么,所以难以捉摸。我得到一个 UnsupportedOperationException,但这不是我在下面看到的方式。
  2. 为什么我会收到警告?有什么问题/缺失?

方法如下:

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);
}

最佳答案

您没有正确引入类型参数 T , 作为 Comparable也是通用的。

应该是:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) 

此外,您可以对 medianHelper 进行排序列表,因为它的元素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()然后手动向其中添加元素。

关于java - 寻找 3 个值的中位数的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29938390/

相关文章:

c - 我的合并排序有什么问题?

c# - 仅使一列可排序的最简单方法

java - 排序 JTable 行问题

java - BufferedInputStream 到 ByteArrayOutputStream 非常慢

java - 在运行时更改标题的颜色

Java 集合泛型 <?扩展 Employee> 抛出异常

Java 泛型 - 接受 float 和 int

scala - 如何在 Scala 中为泛型类型提供默认类型类?

java.xml.bind 从外部文件创建 XMLStreamReader

java - Jackson 将未知属性名称反序列化为自定义实体