我写了一个数据模型,我需要合并3个数组。这些数组具有固定大小(当然)并初始化为null。我使用这段代码:
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);
我需要确定我使用哪个类,但是我得到一个空指针!
答案 0 :(得分:2)
我会利用Collections库
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();
}
}
答案 1 :(得分: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
所述另请注意,您需要将组件而不是 array 类型传递给Arrays.create
。
答案 2 :(得分:0)
您可以在数组中找到项目的类型,因为数组中没有项目
null
没有类型。
相反,您可以通过编写arrays[0].getClass().getComponentType()