如何使用 Java 流克隆数组?
How to clone an array using Java stream?
我有以下数组:
int nums[] = new int[]{1,2,3,4,5};
我想使用流或其他正确的方式将相同的元素添加到数组中,如果使用流更好的话。 List
有 addAll()
方法,但我不能将它用于数组,我不确定数组是否有正确的方法。那么,如何将此列表转换为:
int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5};
使用Arrays.asList(您的数组)将您的数组转换为列表
List<Integer> numList = Arrays.asList(nums);
根据您显示的输出 int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5};
和您的陈述
I want to add the same elements to the array
我想你想问的是如何 re-add 一个数组的元素到同一个数组,虽然你的第一个片段显示 int nums[] = new int[]{4,5,6,7,0,1,2};
而输出与第一个完全无关数组(可能是个小错误)。
但是,在 Java 中无法更新数组的大小。一旦数组被实例化,它的大小就固定了。您可以做的是声明另一个数组,其大小是您要从中复制的原始数组的两倍。
正如@Ole V.V 在评论中指出的那样。您可以使用 IntStream
来实现这一点,这是一种比我使用的方法更好的方法,因为它不会强制您将工作类型从 int[]
更改为 Integer[]
。事实上,Stream
class 适用于泛型类型,因此它适用的唯一参数类型是引用;因此,您只能检索 Integer[]
而不是 int[]
.
的数组
使用 IntStream 的解决方案
int nums[] = new int[]{1, 2, 3, 4, 5};
int[] res = IntStream.concat(IntStream.of(nums), IntStream.of(nums)).toArray();
System.out.println(Arrays.toString(res));
流解决方案
int nums[] = new int[]{1, 2, 3, 4, 5};
Integer[] res = new Integer[0];
res = Stream.concat(Arrays.stream(nums).boxed(), Arrays.stream(nums).boxed())
.collect(Collectors.toList())
.toArray(res);
System.out.println(Arrays.toString(res));
使用 Arrays.copyOf(arg, arg)
怎么样?
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int[] copiedArray = Arrays.copyOf(nums, nums.length);
}
如果你真的想使用Stream,
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int[] copiedArray = Arrays.stream(nums).toArray();
}
根据期望的输出,我猜测初始数组是:
int[] nums = new int[]{1, 2, 3, 4, 5};
数组一旦创建就无法更改其大小,因此您需要声明一个新数组。 @Dan 已经提供了一个带流的 ,所以为了完整起见,我将给出一个带循环的。
public class Temp {
public static void main(String[] args) throws Exception {
int[] nums = new int[]{1, 2, 3, 4, 5};
System.out.println("Initial array");
System.out.println(Arrays.toString(nums));
int[] result = new int[nums.length * 2];
for (int i = 0; i < nums.length; i++) {
result[i] = nums[i];
result[i + nums.length] = nums[i];
}
System.out.println("Result array");
System.out.println(Arrays.toString(result));
}
}
优点是用于填充结果数组的单次迭代。
编辑: 根据@OleV.V 的建议。使用 System.arraycopy() 的解决方案如下所示:
public class Temp {
public static void main(String[] args) throws Exception {
int[] nums = new int[]{1, 2, 3, 4, 5};
int[] result = new int[nums.length * 2];
System.arraycopy(nums, 0, result, 0, nums.length);
System.arraycopy(nums, 0, result, nums.length, nums.length);
System.out.println(Arrays.toString(result));
}
}
优点是 System.arraycopy()
是高度优化和高效的。
迭代或基于流的解决方案不必要地复杂和缓慢。只需使用 System.arraycopy
:
public class Test {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = {6,7,8,9,10};
int[] aAndB = new int[a.length + b.length];
System.arraycopy(a, 0, aAndB, 0, a.length);
System.arraycopy(b, 0, aAndB, a.length, b.length);
System.out.println(Arrays.toString(aAndB));
}
}
System.arraycopy
高度优化:Why is System.arraycopy native in Java?
我有以下数组:
int nums[] = new int[]{1,2,3,4,5};
我想使用流或其他正确的方式将相同的元素添加到数组中,如果使用流更好的话。 List
有 addAll()
方法,但我不能将它用于数组,我不确定数组是否有正确的方法。那么,如何将此列表转换为:
int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5};
使用Arrays.asList(您的数组)将您的数组转换为列表
List<Integer> numList = Arrays.asList(nums);
根据您显示的输出 int nums[] = new int[]{1,2,3,4,5,1,2,3,4,5};
和您的陈述
I want to add the same elements to the array
我想你想问的是如何 re-add 一个数组的元素到同一个数组,虽然你的第一个片段显示 int nums[] = new int[]{4,5,6,7,0,1,2};
而输出与第一个完全无关数组(可能是个小错误)。
但是,在 Java 中无法更新数组的大小。一旦数组被实例化,它的大小就固定了。您可以做的是声明另一个数组,其大小是您要从中复制的原始数组的两倍。
正如@Ole V.V 在评论中指出的那样。您可以使用 IntStream
来实现这一点,这是一种比我使用的方法更好的方法,因为它不会强制您将工作类型从 int[]
更改为 Integer[]
。事实上,Stream
class 适用于泛型类型,因此它适用的唯一参数类型是引用;因此,您只能检索 Integer[]
而不是 int[]
.
使用 IntStream 的解决方案
int nums[] = new int[]{1, 2, 3, 4, 5};
int[] res = IntStream.concat(IntStream.of(nums), IntStream.of(nums)).toArray();
System.out.println(Arrays.toString(res));
流解决方案
int nums[] = new int[]{1, 2, 3, 4, 5};
Integer[] res = new Integer[0];
res = Stream.concat(Arrays.stream(nums).boxed(), Arrays.stream(nums).boxed())
.collect(Collectors.toList())
.toArray(res);
System.out.println(Arrays.toString(res));
使用 Arrays.copyOf(arg, arg)
怎么样?
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int[] copiedArray = Arrays.copyOf(nums, nums.length);
}
如果你真的想使用Stream,
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int[] copiedArray = Arrays.stream(nums).toArray();
}
根据期望的输出,我猜测初始数组是:
int[] nums = new int[]{1, 2, 3, 4, 5};
数组一旦创建就无法更改其大小,因此您需要声明一个新数组。 @Dan 已经提供了一个带流的
public class Temp {
public static void main(String[] args) throws Exception {
int[] nums = new int[]{1, 2, 3, 4, 5};
System.out.println("Initial array");
System.out.println(Arrays.toString(nums));
int[] result = new int[nums.length * 2];
for (int i = 0; i < nums.length; i++) {
result[i] = nums[i];
result[i + nums.length] = nums[i];
}
System.out.println("Result array");
System.out.println(Arrays.toString(result));
}
}
优点是用于填充结果数组的单次迭代。
编辑: 根据@OleV.V 的建议。使用 System.arraycopy() 的解决方案如下所示:
public class Temp {
public static void main(String[] args) throws Exception {
int[] nums = new int[]{1, 2, 3, 4, 5};
int[] result = new int[nums.length * 2];
System.arraycopy(nums, 0, result, 0, nums.length);
System.arraycopy(nums, 0, result, nums.length, nums.length);
System.out.println(Arrays.toString(result));
}
}
优点是 System.arraycopy()
是高度优化和高效的。
迭代或基于流的解决方案不必要地复杂和缓慢。只需使用 System.arraycopy
:
public class Test {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
int[] b = {6,7,8,9,10};
int[] aAndB = new int[a.length + b.length];
System.arraycopy(a, 0, aAndB, 0, a.length);
System.arraycopy(b, 0, aAndB, a.length, b.length);
System.out.println(Arrays.toString(aAndB));
}
}
System.arraycopy
高度优化:Why is System.arraycopy native in Java?