有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arrays Java自定义arrayMerge函数

我正在尝试使用我在Google上找到的自定义函数合并2个int数组:

public static <T> T[] arrayMerge(T[]... arrays)
{
    int count = 0;
    for (T[] array : arrays) count += array.length;

    T[] mergedArray = (T[]) Array.newInstance(arrays[0][0].getClass(),count);
    int start = 0;
    for (T[] array : arrays) {
        System.arraycopy(array, 0, mergedArray, start, array.length);
        start += array.length;
    }
    return (T[]) mergedArray;
}

但我无法理解这个函数需要什么参数。我希望它能像arrayMerge(int[],int[])一样工作,但Eclipse告诉我它不接受这些参数。 我无法通过谷歌搜索大写字母t来找到答案

你可以在表格或阅读材料中回答,但是使用这个函数合并两个int数组的例子就很好了(它是否消除了重复项,如果没有,我怎样才能实现呢?)


共 (3) 个答案

  1. # 1 楼答案

    这种语法被称为varargs——这意味着它将接受任意数量的该类型参数。删除泛型以简化解释,方法定义如下:

    public static void someMethod(int... numbers) {
        // some code
    }
    

    可以这样称呼:

    someMethod(5); // The "numbers" parameter will be an int array size 1: [5]
    someMethod(1,2,3); // The "numbers" parameter will be an int array size 3: [1, 2, 3]
    someMethod(); // The "numbers" parameter will be an int array size 0: []
    

    这就像是一个简写:

    someMethod(new int[] {1, 2, 3});
    

    但不那么难看

    在您的示例中,数组是一个类型化的泛型数组——在调用它之前,您不知道元素类型是什么

  2. # 2 楼答案

    该方法采用任意数量的数组,所有数组都具有相同的类型:

    String[] array1 = ... ;
    String[] array2 = ... ;
    String[] array3 = ... ;
    String[] mergedArray = ArrayHelper.arrayMerge(array1, array2, array3);
    

    然而,由于泛型在Java中的工作方式,您无法传递基元类型的数组(例如int[]

  3. # 3 楼答案

    您在这里发布的代码不仅适用于int任何类型的数组,而且适用于合并2个以上的数组。(无限制)
    T代表泛型类型。见Generics in Java

    只能使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

    • src源数组
    • srcPos源数组中的起始位置
    • dest目标数组
    • destPos目标数据中的起始位置
    • length要复制的数组元素数

    首先制作一个长度与两个数组相同的数组

    public merge(int[] x, int[] y) {
    
        int[] merged = new int[x.length + y.length]
    

    然后用System.arraycopy将第一个数组x复制到0merged
    并用System.arraycopy将第二个数组y复制到x.length处的merged

    但它不能消除重复项

    如果没有重复项,可以使用Set。但我们必须与Integer而不是int合作。
    所以我们必须转换成Integer返回到int。比如:

    HashSet<Integer> set = new HashSet<Integer>();
    for( int i : x ) {
        set.add( Integer.valueOf( i ) );
    }
    for( int i : y ) {
        set.add( Integer.valueOf( i ) );
    }
    int[] merged = new int[set.size()];
    int i = 0;
    for( Integer value : set ) {
        merged[i++] = value.intValue();
    }