Java Arrays.copyOf

时间:2016-12-20 09:55:06

标签: java arrays

我只想复制" 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);
        }
    }
}

4 个答案:

答案 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)