我在 4 个不同的函数中重复了相同的代码,以查找数组中 4 种不同数据类型的最大值:int、short、double 和 float。除了不同的数据类型之外,代码完全相同,因此我决定实现一个可以使用通用数据类型的函数。只要我只返回最大元素,我就能做到这一点,但我的问题是我还想返回找到最大元素的数组的索引。我的有缺陷的代码是:
public static <T extends Comparable <? super T> > T[] maxOfArray (final T [] array)
{
T maximum = array[0];
Integer index = 0;
// Unchecked cast warning, the only thing I could find to create a T array
T[] maxAndIndex = (T[])new Object[2];
for (int i = 1; i < array.length; i++)
{
if (maximum.compareTo(array[i]) < 0)
{
maximum = array[i];
index = i;
}
}
maxAndIndex[0] = maximum;
maxAndIndex[1] = index; // Unable to cast problem
return maxAndIndex;
}
我的问题是:
- 从性能的角度来看,创建一个通用函数而不是 4 个不同的函数(每个函数都使用自己的数据类型)是一个好主意吗?我问这个是因为 Math.java 没有实现泛型。是出于性能原因吗?
- 返回 T 数组是一个坏主意吗?也许因为我只处理数字,所以我总是可以返回一个包含 2 个 double 的数组
- 如何将索引存储在通用数组中,或者如何将最大通用值存储在 double 组中?
请注意,我不希望创建另一个类或返回索引作为输入参数,除非没有任何其他选项,我希望能够以这种方式使用该函数(使用数组作为输入和一个数组作为输出),因为这是创建其他 4 个的方式
最佳答案
- Is it a good idea from the performance point of view to create a generic function instead of 4 different functions each working with its own data type. I'm asking this because Math.java doesn't implement a generic. Is it for performace reasons?
java.lang.Math
中根本没有数组方法。这更可能是没有通用数组方法的原因。
我认为不使用泛型方法不会有性能原因。
- Is it a bad idea to return a T array? Perhaps as I'm only working with numerics I could always return an array of 2 doubles
这是一个坏主意。您会丢失结果的语义:
- 有两个值;
- 第一个值是最大值;
- 第二个值是索引。
这并没有提到您必须进行一些调整才能创建数组这一事实。
- How do I store the index in the generic array or how do I store the maximum generic value in a double array?
你不能。正如 @ElliotFrisch 指出的,一般情况下,您不能在数组中存储 int
和 T
(例如,如果 T
是 字符串
?)。但希望我上面提到的几点暗示你并不真的想这么做。
事实上,您通常可以返回的唯一类型是 Object[]
,因为它是 Integer
索引和 T< 的常见父类(super class)型
值。这使得使用泛型变得不必要:数组是协变的,因此您也可以简单地使用参数 Object[]
。
这为上面的列表添加了第四点:
- 您将丢失所有编译时类型信息。
如果要返回最大元素的索引,则可以轻松获取最大元素的值:
int maxIndex = maxOfArray(arr);
T value = arr[maxIndex];
如果您确实认为实际上需要返回索引和值,请创建一个小结果类,并返回其实例:
class Result<T> {
final int index;
final T value;
Result(int index, T value) { /* initialize fields */ }
// Getters, if you want.
}
这保留了您因尝试返回数组而丢失的语义。
关于java - 查找泛型数组中的最大元素及其位置,并返回包含两者的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39048360/