如何制作一个合并任何类型数组的通用方法?

我有一个方法,它接受两个数组并按自然顺序将它们与元素合并。我想知道是否有可能使它通用,以便它可以采用任何类型的数组并将它们合并到相同类型的数组中?

现在我只能构造一个数组 Object

public static void main(String[] args) {

    Integer[] i1 = {1, 3, 5, 7, 9};
    Integer[] i2 = {2, 4, 6, 8, 10, 12, 14};

    String[] s1 = {"A", "C", "E", "G"};
    String[] s2 = {"B", "D", "F"};

    System.out.println(Arrays.toString(mergeAndSortArrays(i1, i2)));
    System.out.println(Arrays.toString(mergeAndSortArrays(s1, s2)));
}

public static<T extends Comparable<T>> Object[] mergeAndSortArrays(T[] a, T[] b) {
    final Object[] merged = new Object[a.length + b.length];

    int aPos = 0, bPos = 0, curIndex = -1;

    while (++curIndex < merged.length) {

        int comp = a[aPos].compareTo(b[bPos]);
        merged[curIndex] = (comp < 0) ? a[aPos++] : b[bPos++];

        if (aPos == a.length) {
            while (bPos < b.length) {
                merged[++curIndex] = b[bPos++];
            }
            break;
        }

        if (bPos == b.length) {
            while (aPos < a.length) {
                merged[++curIndex] = a[aPos++];
            }
            break;
        }
    }

    return merged;
}

回答

您不能在 Java 中创建泛型类型的数组,但可以使用创建者 lambda:

public static<T extends Comparable<T>> T[] mergeAndSortArrays(
    T[] a, 
    T[] b, 
    IntFunction<T[]> arrayCreator
) {
    final T[] merged = arrayCreator.apply(a.length + b.length);

    ...
}

进而:

mergeAndSortArrays(i1, i2, Integer[]::new)
mergeAndSortArrays(s1, s2, String[]::new)

或者,您有Class<T> itemClass方法参数(而不是 lambda),然后用于(T[]) Array.newInstance(itemClass, a.length + b.length)创建新数组。

如果你想避免额外的方法参数(比如 creator lambda 或 item 类),你可以使用反射来检索数组项类型:

final Class<?> itemClass = a.getClass().getComponentType();
final T[] merged = (T[]) Array.newInstance(itemClass, a.length + b.length);

当然,您也可以为此使用现有的库,例如Apache Commons:

final T[] merged = org.apache.commons.lang3.ArrayUtils.addAll(a, b);
// ...


以上是如何制作一个合并任何类型数组的通用方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>