[英]Removing items from a multi dimensional array in Java
我想从三维数组中删除项目。
我知道这样做的最好方法之一是将数组转换为列表,并在迭代原始数组时从列表中删除这些项,然后将列表转换回数组并返回它。
我试过这个,但回到阵列时出现类型不匹配。 我怀疑从数组转换到列表时我没有对尺寸做过什么。
建议吗?
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] primitive被自动装箱到Float包装器类,然后remove方法检查它是否包含任何等于你的包裹Float的元素。 它会检查整个列表并且找不到任何Float因为...你有一个float [] []列表。 所以基本上你的代码永远不会从列表中删除任何元素。
但无论如何,你应该知道如果你找到一个在remove方法中匹配的元素,你会得到一个UnsupportedOperationException,因为Arrays.asList只是包装你的数组而你的“list”仍然支持float [] [] []阵列。 而你无法调整数组的大小。
然后,无论如何,您通常无法使用==来比较浮点数:
if (data[i][j][k] == data[i][j][k+1]) {
因为它通常是检查两个浮点数是否相等的可怕方法。 应使用epsilon比较浮动数字(您应始终跟踪错误传播)。
关于你的最后一行,你可以回转到float [] [] []但是它没有意义,因为你在第一行中创建的float [] []列表由原始的float [] [] []支持 ,不能修改(好吧,你可以修改单个元素,但不能调整它的大小)。
List points = Arrays.asList(data);
它正在创建二维数组的列表( points
)而不是float
,这正是您所需要的。
但是,您尝试实现您的要求的方式是不可能的,并且在逻辑上无效。
听起来你必须把你的数组变成列表列表。 在删除元素后将其转换回三维数组时逻辑上有意义,因为它会跟踪尺寸。
是不是因为你试图推回到一个三维数组。
您需要在数组中循环填充尺寸2和3,1 x。
整个想法似乎过于复杂,因为您需要在删除值后知道维度,我认为您可能最好维护3d数组并从中删除值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.