首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Arrays.copyOf

Java Arrays.copyOf
EN

Stack Overflow用户
提问于 2016-12-20 17:55:06
回答 4查看 1.5K关注 0票数 3

我只想将"b“、"d”和"e“从arr1复制到arr2,并在添加时动态增加arr2的大小。

我尝试添加一个if条件

代码语言:javascript
复制
 if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
     arr2 = Arrays.copyOf(arr1, i + incrementLength);
 }

但它仍然会复制从arr1到arr2的所有内容。

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 4

Stack Overflow用户

发布于 2016-12-20 18:00:47

代码中的Arrays.copyOf(arr1, i + incrementLength);在循环中创建了多个不必要的arr1副本。做一些你应该避免做的事情。

看看这个Documentation from Oracle。第二个参数是将要复制到arr2arr1元素的数量。

相反,您可以将所需的元素添加到List中,并从该列表中获取数组的副本。如下所示:

代码语言:javascript
复制
    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()]);

更新

如果你不想使用列表,你可以尝试这样做:

代码语言:javascript
复制
    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);
    }

这将生成以下输出:

代码语言:javascript
复制
    b
    d
    e

希望这能有所帮助!

票数 2
EN

Stack Overflow用户

发布于 2016-12-20 17:59:08

如果要复制源数组的单个元素,则不能使用Arrays.copyOf。如果您复制了数组的一个连续子范围,则可以使用System.arraycopy,但这不是您要做的。Arrays.copyOf只能用于复制整个数组或数组的前缀(即从第一个元素到某个索引的所有元素)。

您必须首先计算输出数组所需的长度,实例化输出数组,然后迭代输入数组的元素,并将相关元素逐个复制到输出数组中。

代码语言:javascript
复制
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转换为数组来避免这种情况。

票数 1
EN

Stack Overflow用户

发布于 2016-12-20 18:09:55

也可以使用Streams来完成

代码语言:javascript
复制
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);

打印结果:

代码语言:javascript
复制
Stream.of(arr2)
      .forEach(System.out::println);

提供:

代码语言:javascript
复制
b
d
e
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41239421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档