How can I concatenate two arrays in Java?

后端 未结 30 2029
走了就别回头了
走了就别回头了 2020-11-21 06:05

I need to concatenate two String arrays in Java.

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

What is t

相关标签:
30条回答
  • 2020-11-21 06:43

    It's possible to write a fully generic version that can even be extended to concatenate any number of arrays. This versions require Java 6, as they use Arrays.copyOf()

    Both versions avoid creating any intermediary List objects and use System.arraycopy() to ensure that copying large arrays is as fast as possible.

    For two arrays it looks like this:

    public static <T> T[] concat(T[] first, T[] second) {
      T[] result = Arrays.copyOf(first, first.length + second.length);
      System.arraycopy(second, 0, result, first.length, second.length);
      return result;
    }
    

    And for a arbitrary number of arrays (>= 1) it looks like this:

    public static <T> T[] concatAll(T[] first, T[]... rest) {
      int totalLength = first.length;
      for (T[] array : rest) {
        totalLength += array.length;
      }
      T[] result = Arrays.copyOf(first, totalLength);
      int offset = first.length;
      for (T[] array : rest) {
        System.arraycopy(array, 0, result, offset, array.length);
        offset += array.length;
      }
      return result;
    }
    
    0 讨论(0)
  • 2020-11-21 06:43

    This works, but you need to insert your own error checking.

    public class StringConcatenate {
    
        public static void main(String[] args){
    
            // Create two arrays to concatenate and one array to hold both
            String[] arr1 = new String[]{"s","t","r","i","n","g"};
            String[] arr2 = new String[]{"s","t","r","i","n","g"};
            String[] arrBoth = new String[arr1.length+arr2.length];
    
            // Copy elements from first array into first part of new array
            for(int i = 0; i < arr1.length; i++){
                arrBoth[i] = arr1[i];
            }
    
            // Copy elements from second array into last part of new array
            for(int j = arr1.length;j < arrBoth.length;j++){
                arrBoth[j] = arr2[j-arr1.length];
            }
    
            // Print result
            for(int k = 0; k < arrBoth.length; k++){
                System.out.print(arrBoth[k]);
            }
    
            // Additional line to make your terminal look better at completion!
            System.out.println();
        }
    }
    

    It's probably not the most efficient, but it doesn't rely on anything other than Java's own API.

    0 讨论(0)
  • 2020-11-21 06:44

    A solution 100% old java and without System.arraycopy (not available in GWT client for example):

    static String[] concat(String[]... arrays) {
        int length = 0;
        for (String[] array : arrays) {
            length += array.length;
        }
        String[] result = new String[length];
        int pos = 0;
        for (String[] array : arrays) {
            for (String element : array) {
                result[pos] = element;
                pos++;
            }
        }
        return result;
    }
    
    0 讨论(0)
  • 2020-11-21 06:44

    Another way with Java8 using Stream

      public String[] concatString(String[] a, String[] b){ 
        Stream<String> streamA = Arrays.stream(a);
        Stream<String> streamB = Arrays.stream(b);
        return Stream.concat(streamA, streamB).toArray(String[]::new); 
      }
    
    0 讨论(0)
  • 2020-11-21 06:44

    Here's my slightly improved version of Joachim Sauer's concatAll. It can work on Java 5 or 6, using Java 6's System.arraycopy if it's available at runtime. This method (IMHO) is perfect for Android, as it work on Android <9 (which doesn't have System.arraycopy) but will use the faster method if possible.

      public static <T> T[] concatAll(T[] first, T[]... rest) {
        int totalLength = first.length;
        for (T[] array : rest) {
          totalLength += array.length;
        }
        T[] result;
        try {
          Method arraysCopyOf = Arrays.class.getMethod("copyOf", Object[].class, int.class);
          result = (T[]) arraysCopyOf.invoke(null, first, totalLength);
        } catch (Exception e){
          //Java 6 / Android >= 9 way didn't work, so use the "traditional" approach
          result = (T[]) java.lang.reflect.Array.newInstance(first.getClass().getComponentType(), totalLength);
          System.arraycopy(first, 0, result, 0, first.length);
        }
        int offset = first.length;
        for (T[] array : rest) {
          System.arraycopy(array, 0, result, offset, array.length);
          offset += array.length;
        }
        return result;
      }
    
    0 讨论(0)
  • 2020-11-21 06:44

    How about :

    public String[] combineArray (String[] ... strings) {
        List<String> tmpList = new ArrayList<String>();
        for (int i = 0; i < strings.length; i++)
            tmpList.addAll(Arrays.asList(strings[i]));
        return tmpList.toArray(new String[tmpList.size()]);
    }
    
    0 讨论(0)
提交回复
热议问题