【问题标题】:How to concat two double-arrays with streams如何用流连接两个双数组
【发布时间】:2017-04-26 00:03:38
【问题描述】:

我有两个列表:

类矩阵:List<Stroke> stroke = new ArrayList<>();

类中风:List<Point2D> points = new ArrayList<>();

points 的每个条目都映射到{x, y, z}

points.stream().map(p -> new double[]{p.getX(), p.getY(), 0.0})

每个笔划都会给出一个double[][]

现在我想将stroke 列表转换为double[][]。 由于每个stroke 都会给出double[][],因此需要连接每个数组。

如何处理流?

stroke.stream()....

【问题讨论】:

  • 点列表是否与您的问题相关?你能举一个你想要的具体例子吗?输入输出?
  • @JBNizet:Patrick Parker 提出了我正在寻找的解决方案和示例。

标签: java arrays java-8 concatenation java-stream


【解决方案1】:

感谢Patrick Parkeranswer,我知道如何解决这个问题。

我的解决方案确实是这样的:

class Stroke {
    List<Point2D> points;
    public Stream<double[]> getArrayStream(){
        return points.stream().map(p -> new double[]{p.getX(), p.getY(), 0.0});
    }
}

class Matrix {
    List<Stroke> stroke;
    private double[][] getArray() {
        return strokeManipulationList.stream()
                .flatMap(StrokeManipulation::getArrayStream)
                .toArray(double[][]::new);
    }
}

如果在代码或性能方面有可能的改进,请随时告诉我。

编辑:

再次感谢帕特里克·帕克!我换了

.map(StrokeManipulation::getArrayStream)
.reduce(Stream.empty(), Stream::concat)

只有

.flatMap(StrokeManipulation::getArrayStream)

【讨论】:

  • 我相信你可以将你的地图和归约成一个简单的平面地图
  • 你是对的!整个减少步骤是不必要的。这是一个非常干净的解决方案。
【解决方案2】:

我想你想要这样的东西:

class Stroke {
    List<Point2D> points;
    double[][] toArray() {
        return points.stream()
                // this part you already knew how to do
                .map(p -> new double[]{p.getX(), p.getY(), 0.0})
                .toArray(double[][]::new);
    }   
}
class Matrix {
    List<Stroke> stroke;
    double[][] toArray() {
        return stroke.stream()
                .map(Stroke::toArray)
                // next we will reduce the stream of double[][] to one...
                .reduce(new double[][]{}, (a,b) -> {
                    // ...by concatenating each double[][] with its neighbor
                    return Stream.concat(Arrays.stream(a), Arrays.stream(b))
                            .toArray(double[][]::new);
                });
    }   
}

对于这个任务,我选择了终端操作reduce。详见相关javadoc

但是,我想指出这不会非常有效,因为您在每个缩减阶段都分配一个新数组。使用终端操作collect,您可能会从可变容器类(例如 ArrayList)中获得更好的结果。或者,如您所见,使用Stream&lt;double[]&gt; 而不是使用任何中间容器可以获得更好的结果。

【讨论】:

  • 这就是我要找的:) 谢谢!我在下面添加了一个关于我如何改进解决方案的答案(我认为这是一种改进)。
  • 谁对此投反对票,请阅读原始问题:“每个笔画都会给出一个 double[][]。现在我想将笔画列表转换为 double[][]”。我使用指定的约束回答了最初的问题,然后我继续解释了这种方法的缺点,最后我提出了一个更好的方法。这个三重响应是根据 SO 最佳实践:meta.stackexchange.com/a/269222
猜你喜欢
  • 2015-12-24
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多