2009-03-19 8 views

答えて

2

このような意味ですか?

import java.util.*; 

public class Test { 
    public static void main(String[] args) { 
     String[][] data = new String[][] { 
      { "Foo", "Bar" }, 
      { "A", "B" } 
     }; 

     String[] flattened = flatten(data); 

     for (String x : flattened) { 
      System.out.println(x); 
     } 
    } 

    public static <T> T[] flatten(T[][] source) { 
     int size = 0; 
     for (int i=0; i < source.length; i++) { 
      size += source[i].length; 
     } 

     // Use the first subarray to create the new big one 
     T[] ret = Arrays.copyOf(source[0], size); 
     int index = source[0].length; 
     for (int i=1; i < source.length; i++) { 
      System.arraycopy(source[i], 0, ret, index, source[i].length); 
      index += source[i].length; 
     } 
     return ret; 
    } 

} 

あなたはプリミティブ型のためにそれをしたい場合は、それぞれのプリミティブ型のために過負荷を記述する必要がありますが、あなたはその時点でnew int[size]の代わりArrays.copyOfを使用することができます。それは配列の初期化は、やや混乱ますので、私は意識的にこの例では、ジェネリック型を残し

import java.util.stream.Stream; 

public class ArrayConverter { 

public static String[] flatten(String[][] array) { 
    // Create a stream of the given array 
    return Stream.of(array) 
      // Map each of its elements to a stream (thus creating a 
      // one-dim-array inside the stream, so to say) 
      .flatMap(Stream::of) 
      // Retrieve the stream as array, explicitly calling String to 
      // keep the type 
      .toArray(size -> new String[size]); 
} 

} 

+0

代わりに、すべての原始的な方法をオーバーロードの、それは「ボクシング」メソッドオブジェクトを手動でボックスプリミティブのカップルを書くことが簡単だ - と、まだ平坦化のための平坦化方法を使用する:) –

+0

はあなたでしたあなたが意味することを正確に説明してください。私はそれが本当にint [] []をintに変換するのに本当に役立つだろうか分かりません。それはまた、はるかに効率的ではありません:) –

0

AのJava 8ソリューションは、このような何かを見ることができます。あなたがそれを必要とするかどうか私に教えてください。

特に、プリミティブ型の配列にこの変換を使用する場合は、対応するストリームクラスのフラットメソッドを使用する必要があります。 など。あなたはINT-配列を使用している場合は使用します。

Stream.flatMapToInt(...) 

実際のプリミティブなint-値は、このようにIntegerオブジェクトにオートボクシング逃れてIntStreamを取得します。

JavaDoc of Stream for reference