【问题标题】:How to append entire second array to first array in java如何将整个第二个数组附加到java中的第一个数组
【发布时间】:2012-06-05 16:03:28
【问题描述】:

我知道,我们可以复制或追加数组的元素。但是,我在一个数组中有大约 100 个元素。有没有其他可用的方法,所以我可以将数组附加到第一个数组。

考虑一下我有这两个数组。

 String name1[]={"abc", "def", "ghi"};
 String name2[]={"jkl", "mno", "pqr"};

我想在 name1 的末尾追加 name2 数组。

请帮帮我。

不胜感激。

【问题讨论】:

标签: java arrays append concat


【解决方案1】:

您必须创建一个新数组。因为数组的长度是固定的。

 String[] list = new String[name1.length+name2.length]

您可以循环两个数组并将每个元素添加到新数组中

你也可以使用 apache commons lang library

 String[] both = ArrayUtils.addAll(first, second);

【讨论】:

  • 我刚刚检查过,但是 ArrayUtils 返回 Object[] 而不是 String 数组...请纠正我,如果我出错了。
  • 我可能错了。但是可以转换数组。 (请注意这一点)
  • 对强制转换的数组要非常小心——它的行为不会像普通的String[]
【解决方案2】:

Guava 提供Arrays.concat(T[], T[], Class<T>)

Class 参数的原因,仅供参考,是因为泛型数组具有明显的向上转换趋势。如果你做了Arrays.concat(Integer[], Long[]),你想要一个Object[] 回来吗?还是Number[]? Guava 让您指定,因此没有歧义......而且因为所有替代方案都可能导致在运行时无法预测 ClassCastExceptions。

(披露:我为 Guava 做出了贡献。)

【讨论】:

  • 关于向上转换的好点...如果您提供整数和长数组,我在这里写的作为答案的实现只会在运行时中断...
  • 是的,没错;它会破裂。 (相反,Apache 的ArrayUtils 只会给你一个Object[],你可能会抛出一个不安全的警告,但是不安全的:它可能会导致不可预测的ClassCastExceptions 稍后。)
  • 在我的回答中添加了警告。感谢您的澄清。
【解决方案3】:

您必须创建一个新数组。

使用泛型而不使用任何外部库的简单实现:

public static void main(String[] args) {
    String [] a1 = { "a", "b" };
    String [] a2 = { "c", "d", "e", "f" };

    System.out.println(Arrays.toString(append(a1, a2)));
}

public <K> K[] append(K[] a1, K[] a2) {
    K[] a1a2 = Arrays.copyOf(a1, a1.length + a2.length);
    for (int i = a1.length; i < a1a2.length; i++) {
        a1a2[i] = a2[i - a1.length];
    }
    return a1a2;
}

OBS:正如 Louis Wasserman 在他的回答中所说,Java 将向上转换数组,这可能是一个问题。例如,如果您向上面的 append 方法提供 Long[] 和 Integer[],它将编译但您将在运行时获得 java.lang.ArrayStoreException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多