其他
SO面试题12:如何便捷地将两个数组合到一起?
# 问题
我需要将下发两个String数组合到一起?
void f(String[] first, String[] second) {
String[] both = ???
}
有什么便捷的方式来实现吗?
# 最佳答案
我发现用commons-lang包,一行代码就搞定了,参照其javadoc文档
代码如下:
String[] both = ArrayUtils.addAll(first, second);
是不是so easy!!!
有同学可能会问了,commons-lang包里面的ArrayUtils是如何实现的呢?其实它是通过方法重载的方式来现实支持基本数据类型和对象类型的。
如果你不想借助依赖包,那么我们可以通过下面的方式来实现。
利用泛型来实现,代码如下:
public <T> T[] concatenate (T[] a, T[] b) {
int aLen = a.length;
int bLen = b.length;
@SuppressWarnings("unchecked")
T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen+bLen);
System.arraycopy(a, 0, c, 0, aLen);
System.arraycopy(b, 0, c, aLen, bLen);
return c;
}
当时运行下面这行代码时,会编译不通过:
Assert.assertArrayEquals(new int[]{1, 2, 3}, concatenate(new int[]{1, 2}, new int[]{3}));
为什么呢?
因为泛型不能使用基本数据类型,所以编辑器就会提示你。
那该怎么办呢?既然数组在Java中是一个对象,那么就可以使用泛型,因此,我们可以这样来实现,代码如下:
public static <T> T concatenate(T a, T b) {
if (!a.getClass().isArray() || !b.getClass().isArray()) {
throw new IllegalArgumentException();
}
Class<?> resCompType;
Class<?> aCompType = a.getClass().getComponentType();
Class<?> bCompType = b.getClass().getComponentType();
if (aCompType.isAssignableFrom(bCompType)) {
resCompType = aCompType;
} else if (bCompType.isAssignableFrom(aCompType)) {
resCompType = bCompType;
} else {
throw new IllegalArgumentException();
}
int aLen = Array.getLength(a);
int bLen = Array.getLength(b);
@SuppressWarnings("unchecked")
T result = (T) Array.newInstance(resCompType, aLen + bLen);
System.arraycopy(a, 0, result, 0, aLen);
System.arraycopy(b, 0, result, aLen, bLen);
return result;
}
测试代码:
Assert.assertArrayEquals(new int[]{1, 2, 3}, concatenate(new int[]{1, 2}, new int[]{3}));
经测试,一切OK。
今天的技能get到了么?点赞转发一波,支持我一直写下去~~~
stackoverflow来源:https://stackoverflow.com/questions/80476/how-can-i-concatenate-two-arrays-in-java
往期推荐
🔗
点击阅读原文,获得更多精彩内容