寻找 3 个值的中位数的通用方法
Generic Method to find the median of 3 values
我需要一种方法来获取 3 个值的中位数,我认为这是编写通用方法的好机会,因为我并没有真正实践过。我写了这个,它看起来很简单,虽然我收到警告,但根据我的测试,它似乎工作正常。
我知道我可以使用固有排序集,或 Collections.sort()
,但这种方法是为了便于理解。
我想指出几点:
- 我注意到如果我尝试用
Arrays.asList(a, b, c)
声明 medianHelper
这不起作用,这是为什么?尝试搜索它会给我不相关的结果,而且由于我不确定发生了什么,所以难以捉摸。我得到一个 UnsupportedOperationException
,但这不是我在下面看到的方式。
- 为什么我会收到警告?什么是 wrong/missing?
方法如下:
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()
returns 是一个不可修改的列表,这意味着您不能在创建后 add/remove 元素。如果您想自己进行比较,可以使用 new ArrayList<>
而不是 Arrays.asList()
,然后手动将元素添加到其中。
我需要一种方法来获取 3 个值的中位数,我认为这是编写通用方法的好机会,因为我并没有真正实践过。我写了这个,它看起来很简单,虽然我收到警告,但根据我的测试,它似乎工作正常。
我知道我可以使用固有排序集,或 Collections.sort()
,但这种方法是为了便于理解。
我想指出几点:
- 我注意到如果我尝试用
Arrays.asList(a, b, c)
声明medianHelper
这不起作用,这是为什么?尝试搜索它会给我不相关的结果,而且由于我不确定发生了什么,所以难以捉摸。我得到一个UnsupportedOperationException
,但这不是我在下面看到的方式。 - 为什么我会收到警告?什么是 wrong/missing?
方法如下:
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()
returns 是一个不可修改的列表,这意味着您不能在创建后 add/remove 元素。如果您想自己进行比较,可以使用 new ArrayList<>
而不是 Arrays.asList()
,然后手动将元素添加到其中。