我正在尝试从三维数组中删除项目。
据我所知,执行此操作的最佳方法之一是将数组转换为列表,并在迭代原始数组时从列表中删除这些项,然后将列表转换回数组并返回它。
我试过这个,但回到阵列时出现类型不匹配。我怀疑从数组转换到列表时我没有对尺寸做过什么。
么?
import java.util.List;
import java.util.Arrays;
public class RepatitionRemoval {
public float[][][] process(float[][][] data) {
//this method with step through all of the the strokes and remove
//points which occupy the same position. This should help with time
//warping regconition
//Change the array to a list
List points = Arrays.asList(data);
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
for (int k = 0; k < data[i][j].length-1; k++) {
//if the current coordinate is the same as the one next
//then remove it
if (data[i][j][k] == data[i][j][k+1]) {
points.remove(data[i][j][k]);
}
}
}
}
float[][][] returnData = points.toArray();
return returnData;
}
}
答案 0 :(得分:2)
首先,以下方法无法完成您的预期:
//Change the array to a list
List points = Arrays.asList(data);
顺便说一句好的IDE会自动将其转换为:
List<float[][]> points = Arrays.asList(data);
所以当你接下来做一个:
points.remove(data[i][j][k])
会发生什么? data [i] [j] [k] 原语被自动装箱到 Float 包装类,然后删除方法检查它是否包含与包装的 Float 相等的任何元素。它检查整个列表,但没有找到任何 Float ,因为......你有一个 float [] [] 的列表。所以基本上你的代码永远不会从列表中删除任何元素。
但是无论如何,你应该知道应该你找到一个在 remove 方法中匹配的元素,你会得到一个 UnsupportedOperationException 因为 Arrays.asList 只是包装你的数组,你的“列表”仍然支持 float [] [] [] 数组。而你无法调整阵列的大小。
然后,无论如何,您通常无法使用==:
来比较浮点数if (data[i][j][k] == data[i][j][k+1]) {
因为它通常是检查两个浮点数是否相等的可怕方法。应使用epsilon比较浮动数字(您应该始终跟踪错误传播)。
关于你的最后一行,你可以强制转换回 float [] [] [] 但是它没有意义,因为你创建的 float [] [] 列表第一个是由你原来的 float [] [] [] 支持的,不能修改(好吧,你可以修改单个元素,但你不能调整它的大小)。
答案 1 :(得分:1)
List points = Arrays.asList(data);
它正在创建二维数组的列表(points
),而不是float
,这就是你需要的。
但是你试图达到你的要求的方式是不可能的,而且逻辑上无效。
听起来你必须把你的数组变成列表列表。在删除元素后将其重新转换为三维数组时,这在逻辑上是有意义的,因为它会跟踪尺寸。
答案 2 :(得分:0)
是不是因为你试图推回三维数组。
您需要在数组中循环填充尺寸2和3,1 x。
整个想法似乎过于复杂,因为在删除值后你需要知道尺寸,我认为你可能最好维护3d数组并从中删除值。
答案 3 :(得分:0)
多维数组是数组数组。 data
是float[][]
个对象的数组; data[i]
是float[]
个对象的数组,data[i][j]
是float
个对象的数组。您需要将data
转换为列表。
data[i][j]
转换为列表
此外,您无法直接从Arrays.asList()
返回的列表中删除项目,因为列表由数组直接支持,无法调整大小。相反,您必须填充ArrayList
,删除元素,然后转换回数组并替换原始数据(请参阅this question)
最后,您正在处理一系列基元(float
s),您需要从float[]
转换为ArrayList<Float>
然后再转回。这不是微不足道的; this question可能有帮助