【问题标题】:Copy 2D array in Java using streams使用流在 Java 中复制二维数组
【发布时间】:2018-01-03 09:17:43
【问题描述】:

此问题与How do I copy a 2 Dimensional array in Java?有关

但是如何在 Java 8 / 9 中使用流复制数组?

这是我想出的:

static int[][] cloneArray(int[][] array) {
    return IntStream.range(0, array.length).collect(
            () -> new int[array.length][],
            (ints, i) -> ints[i] = array[i].clone(),
            (ints, i) -> {});
}

有没有更优雅或更高效的方式来使用流复制二维数组?

【问题讨论】:

  • 为什么要装箱?这肯定会扼杀表演。
  • 无法真正看出这是对各种非流方式的改进,除非您的目的是让您的代码更慢且更难阅读。
  • @Kayaman:是的,这很愚蠢。我已经更新了问题。
  • @khelwood;我已经删除了拳击。为什么性能这么慢?
  • 我认为这里的问题是假设流会以某种方式提供更好或更快的方式。像数组复制这样的基本任务已经被有效地解决了,没有太大的优势。

标签: java arrays java-stream


【解决方案1】:
return Arrays.stream(x).map(r->Arrays.copyOf(r, r.length)).toArray(int[][]::new);

我认为这是一个改进,因为您没有分配一个 nxm 数组,然后用一个副本替换所有 m 长度的数组。

【讨论】:

  • 我喜欢它,因为它非常紧凑。但是性能呢?
  • 您不会以这种方式进行双重分配。您可以通过将.clone 调用替换为System.arraycopy 来改进您的尝试,或者至少放弃array[0].length 并将该部分留空。
  • .cloneSystem.arraycopy 慢吗?感谢您提出将 array[0].length 留空的建议。
  • 根据这个问题,您将无法衡量差异。 stackoverflow.com/questions/12157300/clone-or-arrays-copyof 尽管在您的情况下,对于 2D 数组,每行的长度相同,但我怀疑它们 System.arraycopy 将是最快的,因为它会预先分配所有内容。
【解决方案2】:

你可以直接使用

static int[][] cloneArray(int[][] x) {
    return Arrays.stream(x).map(int[]::clone).toArray(int[][]::new);
}

请注意,这适用于任何带有public 方法ElementType clone()ElementType,例如

static ElementType[] cloneArray(ElementType[] x) {
    return Arrays.stream(x).map(ElementType::clone).toArray(ElementType[]::new);
}

在你的情况下,ElementType 恰好是 int[]

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多