2011-10-17 57 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()