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

Leg*_*ato 10 java sorting generics median

我需要一种方法来获得3个值的中值,我认为这是一个编写泛型方法的好机会,因为我没有真正实践过.我写了这个并且看起来非常直截了当,虽然我得到了警告,但根据我的测试,它似乎工作得很好.

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

我想指出一些事情:

  1. 我发现,如果我想声明,这并不工作medianHelperArrays.asList(a, b, c)这是为什么?试图搜索这个给我无关的结果,否则它是难以捉摸的,因为我不确定发生了什么.我得到了一个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);
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 12

您还没有正确引入type-parameter T,因为它Comparable也是通用的.

它应该是:

private static <T extends Comparable<? super T>> T median(T a, T b, T c) 
Run Code Online (Sandbox Code Playgroud)

此外,你可以排序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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,Arrays.asList()返回一个不可修改的列表,这意味着在创建元素后不允许添加/删除元素.如果您希望自己进行比较,可以使用new ArrayList<>而不是Arrays.asList()手动添加元素.

  • 那应该是`T延伸可比较<?超级T>` (2认同)
  • `Arrays.asList`返回一个不可修改的列表,这意味着你可以从中添加/删除对象.我想这就是你现在收到的错误.:)如果你想自己进行比较,你可以使用`new ArrayList <>`然后手动添加元素. (2认同)