我只想复制" b"," d"和" e"从arr1到arr2并在添加时动态增加arr2的大小。
我尝试添加if条件
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2 = Arrays.copyOf(arr1, i + incrementLength);
}
但它仍然会复制从arr1到arr2的所有内容。
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = new String[0];
int incrementLength = 1;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2 = Arrays.copyOf(arr1, i + incrementLength);
}
}
for (String value : arr2) {
System.out.println(value);
}
}
}
答案 0 :(得分:2)
代码中的Arrays.copyOf(arr1, i + incrementLength);
正在循环中创建不必要的多个arr1
副本。你应该避免做的事情。
看看这个http://docs.spring.io/spring-integration/reference/html/mqtt.html#_configuring_with_java_configuration_15。第二个参数是您要复制到arr1
的{{1}}元素数。
相反,您可以将所需元素添加到arr2
,并从该列表中获取该数组的副本。像这样:
List
<强>更新强>
如果您不想使用列表,可以尝试:
List<String> list = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
list.add(arr[i]);
}
}
arr2 = list.toArray(new String[list.size()]);
这会生成以下输出:
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = new String[arr1.length];
int j = 0;
int finalLength = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
// add only elements that you need
arr2[j++] = arr1[i];
// keep track of how many elements you have added
finalLength++;
}
}
// truncate array to finalLength
String[] arr3 = Arrays.copyOf(arr2, finalLength);
for (String value : arr3) {
System.out.println(value);
}
希望这有帮助!
答案 1 :(得分:1)
如果要复制源数组的各个元素,则无法使用Arrays.copyOf
。如果您复制了阵列的连续子范围,您可以使用System.arraycopy
,但这不是您正在做的事情。 Arrays.copyOf
只能用于复制整个数组或数组的前缀(即第一个元素中的所有元素,直到某个索引)。
您必须首先计算输出数组所需的长度,实例化输出数组,然后迭代输入数组的元素,并将相关元素逐个复制到输出数组。
public static void main(String[] args) {
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
int newLen = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
newLen++;
}
}
String[] arr2 = new String[newLen];
int index = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2[index++] = arr1[i];
}
}
for (String value : arr2) {
System.out.println(value);
}
}
这有两次迭代输入数组的缺点,因为在知道它应包含多少元素之前,您无法创建输出数组。您可以通过将输入数组的选定元素添加到ArrayList<String>
,然后将ArrayList
转换为数组来避免这种情况。
答案 2 :(得分:1)
也可以使用Streams:
完成String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = Stream.of(arr1)
.filter(s -> !s.equals("a") && !s.equals("c"))
.toArray(String[]::new);
打印结果:
Stream.of(arr2)
.forEach(System.out::println);
给出:
b
d
e
答案 3 :(得分:0)