Как я могу объединить два массива в Java? - PullRequest
1243 голосов
/ 17 сентября 2008

Мне нужно объединить два String массива в Java.

void f(String[] first, String[] second) {
    String[] both = ???
}

Какой самый простой способ сделать это?

Ответы [ 58 ]

1 голос
/ 01 января 2011

Еще один, основанный на предложении SilverTab, но созданный для поддержки x количества аргументов и не требующий Java 6. Он также не является универсальным, но я уверен, что его можно сделать универсальным.

private byte[] concat(byte[]... args)
{
    int fulllength = 0;
    for (byte[] arrItem : args)
    {
        fulllength += arrItem.length;
    }
    byte[] retArray = new byte[fulllength];
    int start = 0;
    for (byte[] arrItem : args)
    {
        System.arraycopy(arrItem, 0, retArray, start, arrItem.length);
        start += arrItem.length;
    }
    return retArray;
}
0 голосов
/ 10 июня 2011

Самый простой способ найти следующий:


List allFiltersList = Arrays.asList(regularFilters);
allFiltersList.addAll(Arrays.asList(preFiltersArray));
Filter[] mergedFilterArray = (Filter[]) allFiltersList.toArray();

0 голосов
/ 31 марта 2011
Object[] obj = {"hi","there"};
Object[] obj2 ={"im","fine","what abt u"};
Object[] obj3 = new Object[obj.length+obj2.length];

for(int i =0;i<obj3.length;i++)
    obj3[i] = (i<obj.length)?obj[i]:obj2[i-obj.length];
0 голосов
/ 18 сентября 2018

Не Java 8 решение:

public static int[] combineArrays(int[] a, int[] b) {
        int[] c = new int[a.length + b.length];

        for (int i = 0; i < a.length; i++) {
            c[i] = a[i];
        }

        for (int j = 0, k = a.length; j < b.length; j++, k++) {
            c[k] = b[j];
        }

        return c;
    }
0 голосов
/ 21 июля 2011

Вы можете попробовать это

 public static Object[] addTwoArray(Object[] objArr1, Object[] objArr2){
    int arr1Length = objArr1!=null && objArr1.length>0?objArr1.length:0;
    int arr2Length = objArr2!=null && objArr2.length>0?objArr2.length:0;
    Object[] resutlentArray = new Object[arr1Length+arr2Length]; 
    for(int i=0,j=0;i<resutlentArray.length;i++){
        if(i+1<=arr1Length){
            resutlentArray[i]=objArr1[i];
        }else{
            resutlentArray[i]=objArr2[j];
            j++;
        }
    }

    return resutlentArray;
}

Вы можете набрать свой массив !!!

0 голосов
/ 01 марта 2012

В Haskell вы можете сделать что-то подобное [a, b, c] ++ [d, e], чтобы получить [a, b, c, d, e]. Это сцепленные списки на Haskell, но было бы очень приятно увидеть аналогичный оператор в Java для массивов. Тебе так не кажется? Это элегантно, просто, универсально и не так сложно для реализации.

Если хотите, я предлагаю вам взглянуть на работу Александра Христова в его Взломе компилятора OpenJDK . Он объясняет, как изменить исходный код javac для создания нового оператора. Его пример состоит в определении оператора **, где i ** j = Math.pow(i, j). Можно использовать этот пример для реализации оператора, который объединяет два массива одного типа.

Как только вы это сделаете, вы будете привязаны к вашему настроенному javac для компиляции кода, но сгенерированный байт-код будет понят любой JVM.

Конечно, вы можете реализовать свой собственный метод конкатенации массивов на уровне источника, есть много примеров того, как это сделать, в других ответах!

Есть так много полезных операторов, которые могут быть добавлены, и это один из них.

0 голосов
/ 12 апреля 2018

В Java 8

public String[] concat(String[] arr1, String[] arr2){
    Stream<String> stream1 = Stream.of(arr1);
    Stream<String> stream2 = Stream.of(arr2);
    Stream<String> stream = Stream.concat(stream1, stream2);
    return Arrays.toString(stream.toArray(String[]::new));
}
0 голосов
/ 03 октября 2017

Еще один ответ для любителей алгоритма:

public static String[] mergeArrays(String[] array1, String[] array2) {
    int totalSize = array1.length + array2.length; // Get total size
    String[] merged = new String[totalSize]; // Create new array
    // Loop over the total size
    for (int i = 0; i < totalSize; i++) {
        if (i < array1.length) // If the current position is less than the length of the first array, take value from first array
            merged[i] = array1[i]; // Position in first array is the current position

        else // If current position is equal or greater than the first array, take value from second array.
            merged[i] = array2[i - array1.length]; // Position in second array is current position minus length of first array.
    }

    return merged;

Использование:

String[] array1str = new String[]{"a", "b", "c", "d"}; 
String[] array2str = new String[]{"e", "f", "g", "h", "i"};
String[] listTotalstr = mergeArrays(array1str, array2str);
System.out.println(Arrays.toString(listTotalstr));

Результат:

[a, b, c, d, e, f, g, h, i]
0 голосов
/ 08 октября 2015
public int[] mergeArrays(int [] a, int [] b) {
    int [] merged = new int[a.length + b.length];
    int i = 0, k = 0, l = a.length;
    int j = a.length > b.length ? a.length : b.length;
    while(i < j) {
        if(k < a.length) {
            merged[k] = a[k];
            k++;
        }
        if((l - a.length) < b.length) {
            merged[l] = b[l - a.length];
            l++;
        }
        i++;
    }
    return merged;
}
0 голосов
/ 06 декабря 2016
    void f(String[] first, String[] second) {
    String[] both = new String[first.length+second.length];
    for(int i=0;i<first.length;i++)
        both[i] = first[i];
    for(int i=0;i<second.length;i++)
        both[first.length + i] = second[i];
}

Этот работает без знания каких-либо других классов / библиотек и т. Д. Это работает для любого типа данных. Просто замените String на что-нибудь вроде int, double или char. Работает довольно эффективно.

...