我在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的方式
答案 0 :(得分:3)
- 从性能的角度来看,创建一个通用函数而不是4个不同的函数(每个函数都使用自己的数据类型)是一个好主意。我问这个是因为Math.java没有实现泛型。是出于性能原因吗?
醇>
java.lang.Math
中根本没有数组方法。这更可能是没有通用数组方法的原因。
我认为不存在使用通用方法的性能原因。
- 返回T数组是个坏主意吗?也许因为我只使用数字,我总是可以返回2个双打的数组
醇>
这是一个坏主意。你失去了结果的语义:
这并没有提到你必须做一些jiggery pokery来创建数组的事实。
- 如何将索引存储在通用数组中,或者如何将最大通用值存储在双数组中?
醇>
你不能。正如@ElliotFrisch指出的那样,您通常不会在数组中存储int
和T
(例如T
是String
会怎么样?)。但希望我上面提到的观点暗示你并不是真的想要。
实际上,您可以返回的唯一类型是Object[]
,因为这是Integer
索引和T
值的常见超类型。这使得通用不必要的使用:数组是协变的,所以你也可以简单地创建参数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.
}
这样可以保留通过尝试返回数组而丢失的语义。