【问题标题】:Generic Method to find the median of 3 values查找3个值的中位数的通用方法
【发布时间】:2015-07-08 10:09:57
【问题描述】:

我需要一种方法来获得 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);
}

【问题讨论】:

  • 你得到什么警告?

标签: java sorting generics median


【解决方案1】:

您没有正确引入类型参数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&lt;&gt; 代替Arrays.asList(),然后手动添加元素。

【讨论】:

  • 应该是T extends Comparable&lt;? super T&gt;
  • 谢谢你,科科。我完全忽略了Comparable 是通用的,感谢 fge 的重要区别,它也有一个上限。如果我想自己进行比较,我仍然对 Arrays.asList 错误的主题感到困惑。有什么想法吗?
  • Arrays.asList 返回一个不可修改的列表,这意味着您可以从中添加/删除对象。我想这就是你现在收到的错误。 :) 如果您想自己进行比较,可以使用new ArrayList&lt;&gt;,然后手动添加元素。
  • 再次感谢,我认为您应该将其添加到您的答案中。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2022-10-14
  • 2019-08-30
相关资源
最近更新 更多