Java пользовательская функция arrayMerge - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь объединить 2 массива int с помощью этой пользовательской функции, которую я нашел в Google:

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, чтобы найти ответ.

Вы можете ответить в форме или материале для чтения, но пример использования этой функции для слияния 2 массивов int был бы хорош (устраняет ли дубликаты, если нет, как я могу также добиться этого?).

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Метод принимает любое количество массивов, имеющих один и тот же тип:

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

Однако из-за того, как дженерики работают в Java, вы не можете передать массив примитивного типа (например, * 1004).*).

0 голосов
/ 10 августа 2011

Этот синтаксис называется 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});

но менее уродливо.

В вашем примере массив является типизированным универсальным массивом - вы не знаете, какой это тип элемента, пока он не будет вызван.

0 голосов
/ 10 августа 2011

Код, который вы публикуете здесь, предназначен для любого типа массива не только int, но и для объединения более 2 массивов. (Бессрочный)
T обозначает универсальный тип. см. Обобщения в 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 в merged в 0.
И скопируйте с System.arraycopy 2-й массив y в merged при x.length

Но это не устраняет дубликаты.

Если дубликатов нет, вы можете использовать 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...