2011-10-17 13 views
1

私は3つの配列をマージする必要がある1つのクラスにデータモデルを書きました。これらの配列は固定サイズ(もちろん)を持ち、nullに初期化されています。私はこのコードを使用します。null配列をマージするJava

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

    T[] merged = (T[]) Array.newInstance(arrays[0][0].getClass(), size); 

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

この行が正しくありません:

T[] merged = (T[]) Array.newInstance(arrays[0][0].getClass(), size); 

私は私が使用しているクラス正確に必要があるが、私はNULLポインタを取得します!

答えて

2

私はコレクションのライブラリに

public static <T> T[] merge(T[]... arrays) {  
    List<T> list = new LinkedList<T>(); 
    for(T[] array : arrays) { 
     for(T t : array) { 
      list.add(t); 
     } 
    } 
    return (T[])(list.toArray());  
} 

テストプログラムを活用します:配列には項目がありませんので、

import java.util.*; 
class Merger { 
    // break out total length logic. Will probably be inlined, but this seems like 
    // functionality that deserves its own method. 
    public static <T> int totalLength(T[]... arrays) { 
     int length = 0; 
     for(T[] arr : arrays) length += arr.length; 
     return length; 
    } 

    public static <T> T[] merge(T[]... arrays) { 
     int length = totalLength(arrays); 
     if(length == 0) return (T[])new Object[0]; 
     List<T> list = new ArrayList<T>(length); 
     for(T[] array : arrays) { 
      for(T t : array) { 
       list.add(t); 
      } 
     } 
     return (T[])(list.toArray(arrays[0])); 
    } 

    public static void main(String[] args) { 
     String[] first = new String[] { "This", "is", "a", "test" }; 
     String[] second = new String[] { "of", "the", "merger" }; 
     String[] third = new String[] { "and", "it", "works!" }; 

     String[] merged = merge(first,second,third); 
     for(String s : merged) System.out.println(s); 

     // validate that it works for merging all 0 arrays: 
     merge(); 
    } 
} 
+0

を書き込むことによって、配列自体の種類を取得することができます。 – SLaks

+0

@SLaks恐らくもっと早く、おそらく。私はそれが自分自身が問題であることを明らかにするまで無視する非効率性の「97%」の下にあると思います。しかし、私はそれがそうする方が速いことに同意します。 – corsiKa

+0

確かに...私は 'List'インターフェースが' toArray() 'メソッドをサポートしていると信じていますが、' ArrayList'では当然速くなります。 – bdares

0

次のことを試してみてください。

String[] strings = new String[3]; 
Class stringArrayClass = strings.getClass(); 
Class stringArrayComponentType = stringArrayClass.getComponentType(); 
System.out.println(stringArrayComponentType); 

また、あなたがArrays.createコンポーネントではなく配列タイプを渡す必要があることをhttp://tutorials.jenkov.com/java-reflection/arrays.html#componenttype

ノートで説明したように。

0

あなたは、配列内のアイテムの種類を見つけることができます。
nullには型がありません。

代わりに、あなたはより高速になり、適切な容量を持つ `ArrayList`の作成arrays[0].getClass().getComponentType()