java - 查找泛型数组中的最大元素及其位置,并返回包含两者的数组

标签 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 个 double 的数组
  3. 如何将索引存储在通用数组中,或者如何将最大通用值存储在 double 组中?

请注意,我不希望创建另一个类或返回索引作为输入参数,除非没有任何其他选项,我希望能够以这种方式使用该函数(使用数组作为输入和一个数组作为输出),因为这是创建其他 4 个的方式

最佳答案

  1. 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 中根本没有数组方法。这更可能是没有通用数组方法的原因。

我认为不使用泛型方法不会有性能原因。

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

这是一个坏主意。您会丢失结果的语义:

  1. 有两个值;
  2. 第一个值是最大值;
  3. 第二个值是索引。

这并没有提到您必须进行一些调整才能创建数组这一事实。

  1. How do I store the index in the generic array or how do I store the maximum generic value in a double array?

你不能。正如 @ElliotFrisch 指出的,一般情况下,您不能在数组中存储 intT (例如,如果 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/

    相关文章:

    c++ - 模板类的树,其中 chilldren 是 std::array of std::unique_ptr

    c - 如何在C中将数组拆分为两个数组

    c++ - MPI - 随着进程数量的增加没有加速

    java - Eclipse 仅应用一种格式规则

    java - 何时使用国家代码和语言代码

    arrays - 在 flatMap、flatten 或 map 中哪个先发生?

    algorithm - 使用空间索引查找彼此范围内的点

    c++ - 计算使用链接的散列映射的散列函数的散布

    java - 在 junit 测试中通过 URL 提供 stub 文件 -wiremock

    java - 如何使用@StartNode 关系查询 Neo4jRepository?