Java自定义arrayMerge函数

Java自定义arrayMerge函数,java,arrays,merge,Java,Arrays,Merge,我正在尝试使用在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 st

我正在尝试使用在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;
}
publicstatict[]数组合并(T[]数组)
{
整数计数=0;
对于(T[]数组:数组)count+=array.length;
T[]mergedArray=(T[])数组。newInstance(数组[0][0]。getClass(),count);
int start=0;
for(T[]数组:数组){
数组复制(数组,0,合并数组,开始,数组,长度);
start+=array.length;
}
返回(T[])合并Darray;
}
但我不能理解这个函数需要什么参数。我希望它能像arrayMerge(int[],int[])一样工作,但Eclipse告诉我它不接受这些参数。 我无法通过谷歌搜索大写字母t来找到答案


您可以在表单或阅读材料中进行回答,但使用此函数合并2个int数组的示例会很好(它是否消除了重复项,如果没有,我如何实现这一点?)

您在此处发布的代码不仅适用于任何类型的数组
int
,而且适用于合并2个以上的数组。(无限制)
T
表示泛型类型。看

您只能使用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]
然后使用
系统进行复制。数组将第一个数组
x
复制到
合并的
0

并使用
System.arraycopy
将第二个数组
y
复制到
合并的
x.length

但它不能消除重复项

对于无重复项,您可以使用。但是我们必须使用
Integer
而不是
int

因此,我们必须转换为
整数
返回到
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();
}
HashSet=newhashset();
for(int i:x){
set.add(Integer.valueOf(i));
}
for(int i:y){
set.add(Integer.valueOf(i));
}
int[]合并=新int[set.size()];
int i=0;
for(整数值:设置){
合并的[i++]=value.intValue();
}

您在此处发布的代码不仅适用于任何类型的数组
int
,而且适用于两个以上要合并的数组。(无限制)
T
表示泛型类型。看

您只能使用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]
然后使用
系统进行复制。数组将第一个数组
x
复制到
合并的
0

并使用
System.arraycopy
将第二个数组
y
复制到
合并的
x.length

但它不能消除重复项

对于无重复项,您可以使用。但是我们必须使用
Integer
而不是
int

因此,我们必须转换为
整数
返回到
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();
}
HashSet=newhashset();
for(int i:x){
set.add(Integer.valueOf(i));
}
for(int i:y){
set.add(Integer.valueOf(i));
}
int[]合并=新int[set.size()];
int i=0;
for(整数值:设置){
合并的[i++]=value.intValue();
}

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

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

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

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

String[] array1 = ... ;
String[] array2 = ... ;
String[] array3 = ... ;
String[] mergedArray = ArrayHelper.arrayMerge(array1, array2, array3);
但是,由于泛型在Java中的工作方式,您无法传递基元类型的数组(例如
int[]
)。

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

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});
但不那么难看

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

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

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});
但不那么难看


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

那么我得到的原因是:type Main中的方法arrayMerge(t[])不适用于参数(int[],int[]),因为泛型不适用于基本类型。即使用作数组元素。T只能代表类型,可以不经过转换就分配给对象(如装箱)@Dirk:这些通常被称为“引用类型”。@joachim-我试图避免使用行话(但完全失败了——“泛型”、“装箱”),但无论如何还是要感谢:-)@Dirk:我想是的,实际上我的评论也是针对user781655的。我只是想把这个术语说出来。那我怎么会得到:类型Main中的方法arrayMerge(T[])不适用于参数(int[],int[])因为泛型不适用于基元类型。即使用作数组元素。T也只能代表类型,这些类型可以在不进行转换(如装箱)的情况下分配给对象@Dirk:这些通常被称为“引用类型”。@joachim-I tri