我需要在Java中串联两个String数组。
void f(String[] first, String[] second) {
String[] both = ???
}
最简单的方法是什么?
#1楼
一个简单的变体,可以连接多个数组:
public static String[] join(String[]...arrays) {
final List output = new ArrayList();
for(String[] array : arrays) {
output.addAll(Arrays.asList(array));
}
return output.toArray(new String[output.size()]);
}
#2楼
请原谅我为这个已经很长的列表添加了另一个版本。 我查看了每个答案,并决定我真的想要一个签名中仅包含一个参数的版本。 我还添加了一些参数检查功能,以便在意外输入的情况下从早期失败中获得明智的信息。
@SuppressWarnings("unchecked")
public static T[] concat(T[]... inputArrays) {
if(inputArrays.length < 2) {
throw new IllegalArgumentException("inputArrays must contain at least 2 arrays");
}
for(int i = 0; i < inputArrays.length; i++) {
if(inputArrays[i] == null) {
throw new IllegalArgumentException("inputArrays[" + i + "] is null");
}
}
int totalLength = 0;
for(T[] array : inputArrays) {
totalLength += array.length;
}
T[] result = (T[]) Array.newInstance(inputArrays[0].getClass().getComponentType(), totalLength);
int offset = 0;
for(T[] array : inputArrays) {
System.arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}
#3楼
哇! 这里有很多复杂的答案,包括一些依赖于外部依赖性的简单答案。 这样做是如何的:
String [] arg1 = new String{"a","b","c"};
String [] arg2 = new String{"x","y","z"};
ArrayList temp = new ArrayList();
temp.addAll(Arrays.asList(arg1));
temp.addAll(Arrays.asList(arg2));
String [] concatedArgs = temp.toArray(new String[arg1.length+arg2.length]);
#4楼
思考问题的另一种方式。 要连接两个或多个数组,必须要做的就是列出每个数组的所有元素,然后构建一个新的数组。 这听起来像创建List ,然后在其上调用toArray 。 其他一些答案使用ArrayList ,那很好。 但是如何实施我们自己的呢? 这并不难:
private static T[] addAll(final T[] f, final T...o){
return new AbstractList(){
@Override
public T get(int i) {
return i>=f.length ? o[i - f.length] : f[i];
}
@Override
public int size() {
return f.length + o.length;
}
}.toArray(f);
}
我相信以上等效于使用System.arraycopy解决方案。 但是我认为这有它自己的美丽。
#5楼
ArrayList both = new ArrayList(Arrays.asList(first));
both.addAll(Arrays.asList(second));
both.toArray(new String[0]);