public static String[] join(String[]...arrays) {
final List<String> output = new ArrayList<String>();
for(String[] array : arrays) {
output.addAll(Arrays.asList(array));
}
return output.toArray(new String[output.size()]);
}
4
怎么样简单
public static class Array {
public static <T> T[] concat(T[]... arrays) {
ArrayList<T> al = new ArrayList<T>();
for (T[] one : arrays)
Collections.addAll(al, one);
return (T[]) al.toArray(arrays[0].clone());
}
}
public class StringConcatenate {
public static void main(String[] args){
// Create two arrays to concatenate and one array to hold both
String[] arr1 = new String[]{"s","t","r","i","n","g"};
String[] arr2 = new String[]{"s","t","r","i","n","g"};
String[] arrBoth = new String[arr1.length+arr2.length];
// Copy elements from first array into first part of new array
for(int i = 0; i < arr1.length; i++){
arrBoth[i] = arr1[i];
}
// Copy elements from second array into last part of new array
for(int j = arr1.length;j < arrBoth.length;j++){
arrBoth[j] = arr2[j-arr1.length];
}
// Print result
for(int k = 0; k < arrBoth.length; k++){
System.out.print(arrBoth[k]);
}
// Additional line to make your terminal look better at completion!
System.out.println();
}
}
它可能不是最有效的,但它不依赖于Java自己的API以外的任何东西 .
37
Java 8中的单线程:
String[] both = Stream.concat(Arrays.stream(a), Arrays.stream(b))
.toArray(String[]::new);
要么:
String[] both = Stream.of(a, b).flatMap(Stream::of)
.toArray(String[]::new);
5
Java8使用Stream的另一种方式
public String[] concatString(String[] a, String[] b){
Stream<String> streamA = Arrays.stream(a);
Stream<String> streamB = Arrays.stream(b);
return Stream.concat(streamA, streamB).toArray(String[]::new);
}
5
这里是由silvertab编写的伪代码解决方案的工作代码中的可能实现 .
谢谢silvertab!
public class Array {
public static <T> T[] concat(T[] a, T[] b, ArrayBuilderI<T> builder) {
T[] c = builder.build(a.length + b.length);
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}
}
接下来是构建器界面 .
注意:构建器是必需的,因为在java中不可能这样做
new T[size]
由于通用类型擦除:
public interface ArrayBuilderI<T> {
public T[] build(int size);
}
这是一个实现接口的具体构建器,构建一个 Integer 数组:
public class IntegerArrayBuilder implements ArrayBuilderI<Integer> {
@Override
public Integer[] build(int size) {
return new Integer[size];
}
}
最后是申请/测试:
@Test
public class ArrayTest {
public void array_concatenation() {
Integer a[] = new Integer[]{0,1};
Integer b[] = new Integer[]{2,3};
Integer c[] = Array.concat(a, b, new IntegerArrayBuilder());
assertEquals(4, c.length);
assertEquals(0, (int)c[0]);
assertEquals(1, (int)c[1]);
assertEquals(2, (int)c[2]);
assertEquals(3, (int)c[3]);
}
}
30 回答
这是String数组的转换函数:
Functional Java库有一个数组包装类,它为数组提供了连接等方便的方法 .
...然后
要取出展开的阵列,请致电
如果您使用这种方式,则无需导入任何第三方类 .
如果你想连接
String
Sample code for concate two String Array
如果你想连接
Int
Sample code for concate two Integer Array
Here is Main method
我们也可以用这种方式 .
您可以尝试将其转换为Arraylist并使用addAll方法然后转换回数组 .
这是对silvertab解决方案的改编,改进了仿制药:
注意:有关Java 6解决方案,请参阅Joachim's answer . 它不仅消除了警告;它也更短,更高效,更容易阅读!
允许连接多个阵列的简单变体:
怎么样简单
只需做
Array.concat(arr1, arr2)
. 只要arr1
和arr2
属于同一类型,这将为您提供另一个包含两个数组的相同类型的数组 .这是一个简单的方法,它将连接两个数组并返回结果:
请注意,它不适用于原始数据类型,仅适用于对象类型 .
以下稍微复杂的版本适用于对象和基本数组 . 它通过使用
T
而不是T[]
作为参数类型来完成此操作 .它还可以通过选择最常用的类型作为结果的组件类型来连接两种不同类型的数组 .
这是一个例子:
怎么样 :
您可以将这两个数组附加到两行代码中 .
这是一种快速有效的解决方案,适用于原始类型,并且所涉及的两种方法都是重载的 .
您应该避免涉及ArrayLists,流等的解决方案,因为这些解决方案需要分配临时内存而没有用处 .
你应该避免
for
循环,因为这些循环效率不高 . 内置方法使用极快的块复制功能 .另一种思考问题的方法 . 要连接两个或多个数组,必须要列出每个数组的所有元素,然后构建一个新数组 . 这听起来像创建
List<T>
然后在其上调用toArray
. 其他一些答案使用ArrayList
,这很好 . 但是如何实现我们自己的呢?这并不难:我相信上面的内容相当于使用
System.arraycopy
的解决方案 . 不过我觉得这个有自己的美 .可以编写一个完全通用的版本,甚至可以扩展为连接任意数量的数组 . 这个版本需要Java 6,因为它们使用Arrays.copyOf()
两个版本都避免创建任何中间
List
对象并使用System.arraycopy()
来确保尽可能快地复制大型数组 .对于两个数组,它看起来像这样:
对于任意数量的数组(> = 1),它看起来像这样:
这是我对Joachim Sauer的concatAll略有改进的版本 . 如果它在运行时可用,它可以在Java 5或6上使用Java 6的System.arraycopy . 这种方法(恕我直言)非常适合Android,因为它适用于Android <9(没有System.arraycopy),但如果可能的话,将使用更快的方法 .
我从优秀的旧Apache Commons Lang库中找到了一个单行解决方案 .
ArrayUtils.addAll(T[], T...)
码:
解决方案 100% old java 和 without
System.arraycopy
(例如,在GWT客户端中不可用):或者与心爱的Guava:
此外,还有原始数组的版本:
Booleans.concat(first, second)
Bytes.concat(first, second)
Chars.concat(first, second)
Doubles.concat(first, second)
Shorts.concat(first, second)
Ints.concat(first, second)
Longs.concat(first, second)
Floats.concat(first, second)
仅使用Javas自己的API:
现在,这段代码不是最有效的,但它只依赖于标准的java类,并且易于理解 . 它适用于任意数量的String [](甚至是零数组) .
这有效,但您需要插入自己的错误检查 .
它可能不是最有效的,但它不依赖于Java自己的API以外的任何东西 .
Java 8中的单线程:
要么:
Java8使用Stream的另一种方式
这里是由silvertab编写的伪代码解决方案的工作代码中的可能实现 .
谢谢silvertab!
接下来是构建器界面 .
注意:构建器是必需的,因为在java中不可能这样做
new T[size]
由于通用类型擦除:
这是一个实现接口的具体构建器,构建一个
Integer
数组:最后是申请/测试:
使用Java API:
我最近在过度记忆旋转方面遇到了问题 . 如果已知a和/或b通常是空的,那么这是另一个silvertab代码的修改(也是通用的):
(在任何一种情况下,数组重用行为都应该是明确的JavaDoced!)
请原谅我在这个已经很久的列表中添加了另一个版本 . 我看了每个答案,然后决定我真的想要签名中只有一个参数的版本 . 我还添加了一些参数检查,以便在意外输入的情况下通过合理的信息从早期故障中受益 .
一个独立的类型变体(更新 - 感谢Volley实例化T):
一种简单但低效的方法(不包括泛型):
哇!这里有很多复杂的答案,包括一些依赖外部依赖的简单答案 . 怎么样这样做: