Java - 配列を結合する方法

この記事では、Java Arrayへの参加方法をいくつか紹介します。

  1. Apache Commons Lang - ArrayUtils

  2. Java API

  3. Java 8ストリーム

1. Apache Commons Lang - ArrayUtils

最も簡単な方法は、http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#addAll%28T%5B%5D,%20T …​%29[Apache Commons Lang]ライブラリにあり、 `ArrayUtils。 addAll`を実行して配列を結合します。このメソッドは、プリミティブ型とオブジェクト型の両方の配列をサポートします。

JoinArray.java

package com.mkyong.example.array;

import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;

public class JoinArray {

    public static void main(String[]args) {

        String[]s1 = new String[]{"a", "b", "c"};
        String[]s2 = new String[]{"d", "e", "f"};

        String[]result = ArrayUtils.addAll(s1, s2);

        System.out.println(Arrays.toString(result));

        int[]int1 = new int[]{1,2,3};
        int[]int2 = new int[]{4,5,6};

        int[]result2 = ArrayUtils.addAll(int1, int2);

        System.out.println(Arrays.toString(result2));

    }

}

出力

…​.[a, b, c, d, e, f][1, 2, 3, 4, 5, 6]…​.

Mavenユーザーの場合。

pom.xml

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

2. Java API

純粋なJava APIの例です。プリミティブ型とジェネリック型の両方をサポートしています。

JoinArray.java

package com.mkyong.example.array;

import java.lang.reflect.Array;
import java.util.Arrays;

public class JoinArray {

    public static void main(String[]args) {

        String[]s1 = new String[]{"a", "b", "c"};
        String[]s2 = new String[]{"d", "e", "f"};
        String[]s3 = new String[]{"g", "h", "i"};

        String[]result = joinArrayGeneric(s1, s2, s3);

        System.out.println(Arrays.toString(result));

        int[]int1 = new int[]{1, 2, 3};
        int[]int2 = new int[]{4, 5, 6};
        int[]int3 = new int[]{7, 8, 9};

        int[]result2 = joinArray(int1, int2, int3);

        System.out.println(Arrays.toString(result2));

    }

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

       //T[]result = new T[length];
        final T[]result = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), length);

        int offset = 0;
        for (T[]array : arrays) {
            System.arraycopy(array, 0, result, offset, array.length);
            offset += array.length;
        }

        return result;
    }

    static int[]joinArray(int[]... arrays) {
        int length = 0;
        for (int[]array : arrays) {
            length += array.length;
        }

        final int[]result = new int[length];

        int offset = 0;
        for (int[]array : arrays) {
            System.arraycopy(array, 0, result, offset, array.length);
            offset += array.length;
        }

        return result;
    }

   //create other overloaded primitive type - long, double...
   //static long[]joinArray(long[]... arrays)
}

出力

…​.[a, b, c, d, e, f, g, h, i][1, 2, 3, 4, 5, 6, 7, 8, 9]…​.

3. Java 8ストリーム

配列を結合するJava 8 Streamの例

JoinArray.java

package com.mkyong.example.array;

import java.util.Arrays;

import java.util.stream.IntStream;
import java.util.stream.Stream;

public class JoinArray {

    public static void main(String[]args) {

        String[]s1 = new String[]{"a", "b", "c"};
        String[]s2 = new String[]{"d", "e", "f"};
        String[]s3 = new String[]{"g", "h", "i"};

       //join object type array
        String[]result = Stream.of(s1, s2, s3).flatMap(Stream::of).toArray(String[]::new);
        System.out.println(Arrays.toString(result));

        int[]int1 = new int[]{1,2,3};
        int[]int2 = new int[]{4,5,6};
        int[]int3 = new int[]{7,8,9};

       //join 2 primitive type array
        int[]result2 = IntStream.concat(Arrays.stream(int1), Arrays.stream(int2)).toArray();

       //join 3 primitive type array, any better idea?
        int[]result3 = IntStream.concat(Arrays.stream(int1),
            IntStream.concat(Arrays.stream(int2), Arrays.stream(int3))).toArray();

        System.out.println(Arrays.toString(result2));

        System.out.println(Arrays.toString(result3));

    }

}

出力

…​.[a, b, c, d, e, f, g, h, i][1, 2, 3, 4, 5, 6][1, 2, 3, 4, 5, 6, 7, 8, 9]…​.

より良いJava 8 Streamの例?以下のコメントをしてください。

参考文献

8:従来のforループをIntStreamsに置き換える]。 http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ [Java

8ストリームチュートリアル]

リンク://タグ/配列/[配列]リンク://タグ/java/[java]リンク://タグ/java8/[java8]リンク://タグ/ストリーム/[ストリーム]