用于查找3个值的中值的通用方法

时间:2015-04-29 08:33:47

标签: java sorting generics median

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

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

我想指出一些事情:

  1. 我注意到如果我尝试用medianHelper声明Arrays.asList(a, b, c),这不起作用为什么会这样?试图搜索这会给我带来无关的结果,否则它难以捉摸,因为我不确定发生了什么。我得到一个UnsupportedOperationException,但这不是我在下面的方式。
  2. 为什么我会收到警告?有什么不对/缺失?
  3. 方法如下:

    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 个答案:

答案 0 :(得分:12)

您尚未正确引入类型参数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(),然后手动将元素添加到其中。