在Generics数组中查找最大元素及其位置,并返回包含

时间:2016-08-19 22:12:08

标签: java arrays performance generics casting

我在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;

}

我的问题是:

  1. 从性能的角度来看,创建一个通用函数而不是4个不同的函数(每个函数都使用自己的数据类型)是一个好主意。我问这个是因为Math.java没有实现泛型。是出于性能原因吗?
  2. 返回T数组是个坏主意吗?也许因为我只使用数字,我总是可以返回2个双打的数组
  3. 如何将索引存储在通用数组中,或者如何将最大通用值存储在双数组中?
  4. 请注意我不打算创建另一个类或将索引作为输入参数返回,除非没有任何其他选项,我希望能够以这种方式使用该函数(使用数组作为输入和数组作为输出),因为它是创建其他4的方式

1 个答案:

答案 0 :(得分:3)

  
      
  1. 从性能的角度来看,创建一个通用函数而不是4个不同的函数(每个函数都使用自己的数据类型)是一个好主意。我问这个是因为Math.java没有实现泛型。是出于性能原因吗?
  2.   

java.lang.Math中根本没有数组方法。这更可能是没有通用数组方法的原因。

我认为不存在使用通用方法的性能原因。

  
      
  1. 返回T数组是个坏主意吗?也许因为我只使用数字,我总是可以返回2个双打的数组
  2.   

这是一个坏主意。你失去了结果的语义:

  1. 有两个值;
  2. 第一个值是最大值;
  3. 第二个值是索引。
  4. 这并没有提到你必须做一些jiggery pokery来创建数组的事实。

      
        
    1. 如何将索引存储在通用数组中,或者如何将最大通用值存储在双数组中?
    2.   

    你不能。正如@ElliotFrisch指出的那样,您通常不会在数组中存储intT(例如TString会怎么样?)。但希望我上面提到的观点暗示你并不是真的想要。

    实际上,您可以返回的唯一类型是Object[],因为这是Integer索引和T值的常见超类型。这使得通用不必要的使用:数组是协变的,所以你也可以简单地创建参数Object[]

    这为上面的列表增加了第四点:

    1. 您将丢失所有编译时类型信息。
    2. 如果要返回最大元素的索引,则可以平凡地获取最大元素的值:

      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.
      }
      

      这样可以保留通过尝试返回数组而丢失的语义。