繁体   English   中英

将二维 ArrayList 转换为二维浮点数组

[英]Converting 2 dimensional ArrayList to 2 dimensional float array

ArrayList<ArrayList<Float>> lists = new ArrayList<ArrayList<Float>>();

这是我正在使用的 arraylist。 我试过这个:

float[][] trainingData = lists.stream()
                        .map(l -> l.stream()
                       .mapToFloat(Float::parseFloat)
                       .toArray())
                       .toArray(float[][]::new);

我收到此错误:

未定义 Stream 类型的方法 mapToFloat(Float::parseFloat)

我必须将此二维 ArrayList 转换为二维浮点数组。

首先,您的代码不起作用的原因是因为 Java API 中没有这样的方法mapToFloat ,但最重要的是没有FloatStream

如果您想通过流来完成此操作,您的选择非常有限:

  1. 累积到Float[][]而不是float[][] ,这可能并不理想,因为当您稍后想在应用程序中执行一些计算时,它涉及装箱和拆箱瓶颈。

这可以通过以下方式完成:

Float[][] trainingData = lists.stream()
                .map(l -> l.toArray(new Float[0]))
                .toArray(Float[][]::new);
  1. 首先使用List<List<Double>>而不是List<List<Float>>来表示您的训练数据,然后您可以在需要时将其转换为double[][]

这可以通过以下方式完成:

double[][] trainingData = lists.stream()
                .map(l -> l.stream().mapToDouble(Double::doubleValue).toArray())
                .toArray(double[][]::new);

但是如果由于某种原因您无法更改数据的初始类型,那么您仍然可以转换为double[][]

这可以通过以下方式完成:

double[][] trainingData = lists.stream()
                .map(l -> l.stream().mapToDouble(Float::doubleValue).toArray())
                .toArray(double[][]::new);
  1. 定义您自己的Collector ,您应该能够通过一些研究在站点内找到它。

最终,您最好在这里使用命令式方法,即for循环。

尝试这个:

Float[][] trainingData = lists
             .stream().map(lst -> lst.stream().toArray(Float[]::new))
             .toArray(Float[][]::new);

如果您需要原始 arrays,我能想到的唯一方法就是您可能已经知道(但为了完整性我包括在内)。

float[][] trainingData = new float[lists.size()][];

for (int i = 0; i < lists.size(); i++) {
    List<Float> innerList = lists.get(i);
    float[] temp = trainingData[i] = new float[innerList.size()];
    for (int k = 0; k < temp.length; k++) {
            temp[k] = innerList.get(k);
    }
}

for(float[] v : trainingData) {
    System.out.println(Arrays.toString(v));
}

两者都打印

[10.0, 10.2]
[20.4, 2.6]

对于浮点数,stream 没有好方法,您可以通过这种方式获得二维双数组

double[][] trainingData = lists.stream()
        .map(l -> l.stream().mapToDouble(f -> f.doubleValue()).toArray()).toArray(double[][]::new);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM