ArrayList<ArrayList<Float>> lists = new ArrayList<ArrayList<Float>>();
这是我正在使用的数组列表。 我尝试过:
float[][] trainingData = lists.stream()
.map(l -> l.stream()
.mapToFloat(Float::parseFloat)
.toArray())
.toArray(float[][]::new);
我遇到此错误:
未为Stream类型定义方法mapToFloat(Float :: parseFloat)
我必须将此二维ArrayList转换为二维Float数组。
答案 0 :(得分:2)
首先,您的代码不起作用的原因是因为Java API中没有这样的方法mapToFloat
,但最重要的是没有FloatStream
。
如果您想通过流完成此操作,则您的选择非常有限:
Float[][]
而不是float[][]
,这可能并不理想,因为当您以后要在应用程序中执行一些计算时,它涉及装箱和拆箱瓶颈。 这可以通过以下方式完成:
Float[][] trainingData = lists.stream()
.map(l -> l.toArray(new Float[0]))
.toArray(Float[][]::new);
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);
Collector
,您应该可以通过一些研究在网站上找到它。最终,最好在这里使用命令式方法,即for
循环。
答案 1 :(得分:1)
尝试一下:
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]
答案 2 :(得分:1)
对于浮点数,流没有好的方法,您可以通过这种方式获得2D双数组
double[][] trainingData = lists.stream()
.map(l -> l.stream().mapToDouble(f -> f.doubleValue()).toArray()).toArray(double[][]::new);