【问题标题】:Converting 2 dimensional ArrayList to 2 dimensional float array将二维 ArrayList 转换为二维浮点数组
【发布时间】:2023-04-03 00:19:01
【问题描述】:
ArrayList<ArrayList<Float>> lists = new ArrayList<ArrayList<Float>>();

这是我正在使用的数组列表。 我试过这个:

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

我收到此错误:

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

我必须将这个二维 ArrayList 转换为二维 Float 数组。

【问题讨论】:

  • lists.stream() .flatMap(Collection::stream) .toArray(float[][]::new);
  • 你能用Float[][]代替float[][]吗?如果没有,您唯一的选择是双 for 循环。
  • This answer 包含float[] 数组的收集器。看到它,你可能会意识到使用循环更简单……

标签: java arrays arraylist java-stream


【解决方案1】:

首先,您的代码无法运行的原因是因为 Java API 中没有 mapToFloat 这样的方法,但最重要的是没有 FloatStream

如果您想通过流实现此目的,您的选择非常有限:

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

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

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

【讨论】:

  • 当你说“首先使用List&lt;List&lt;Double&gt;&gt;”时,在示例代码中使用Float::doubleValue 是矛盾的。
  • @Holger 我知道你来自哪里,但那段代码指的是 ,但如果你因为任何原因无法更改数据的初始类型,那么你仍然可以转换为 double [][]。。我会尽力澄清这一点。
  • 因此实际上没有将List&lt;List&lt;Double&gt;&gt; 转换为double[][] 的示例。但是当您将Float::doubleValue 更改为Number::doubleValue 时,无论OP 使用List&lt;List&lt;Double&gt;&gt; 还是List&lt;List&lt;Float&gt;&gt;,代码都可以工作......
【解决方案2】:

试试这个:

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

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

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]

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2019-01-23
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多