2011-10-17 74 views
1

我寫了一個數據模型,將其合併到一個類中,我需要合併3個數組。這些數組具有固定大小(當然)並初始化爲空。我用這個代碼:合併空陣列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); 

我需要精確的哪一類我用,但我得到一個空指針!

回答

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

創建具有適當能力的'ArrayList'會更快得到陣列本身的類型。 – 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); 
截至 http://tutorials.jenkov.com/java-reflection/arrays.html#componenttype

還請注意,你需要通過組件而非陣列類型Arrays.create描述

0

您可以找到數組中的項目的類型,因爲在數組中沒有的項目。
null沒有類型。

取而代之的是,你可以通過編寫arrays[0].getClass().getComponentType()