我正在尝试从 3 维数组中删除项目。
我知道最好的方法之一是将数组转换为列表,并在遍历原始数组的同时从列表中删除这些项目,然后将列表转换回数组并返回它。
我试过了,但返回数组时出现类型不匹配。我怀疑在从数组转换为列表时我没有对维度做任何事情。
建议?
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;
}
}
最佳答案
首先,下面的方法并没有像你想的那样:
//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 包装类,然后是 remove 方法检查它是否包含任何等于包装的 Float 的元素。它检查了整个列表,但没有找到任何 Float,因为...您有一个 float[][] 的列表。所以基本上你的代码永远不会从列表中删除任何元素。
但是无论如何,您应该知道应该您找到一个与remove 方法匹配的元素,您将得到一个UnsupportedOperationException因为 Arrays.asList 只是包装了您的数组,而您的“列表”仍然支持 float[][][] 数组。而且您不能调整数组的大小。
然后,无论如何,您通常不能使用 == 比较 float :
if (data[i][j][k] == data[i][j][k+1]) {
因为它通常是检查两个 float 是否相等的糟糕方法。应使用 epsilon 比较 float (并且您应始终跟踪错误传播)。
关于您的最后一行,您可以转换回 float[][][] 但它毫无意义,因为您创建的 float[][] 列表第一个由您的原始 float[][][] 支持并且无法修改(好吧,您可以修改单个元素,但不能调整它的大小)。
关于java - 从Java中的多维数组中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8509003/