繁体   English   中英

在Java中从多维数组中删除项目

[英]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数组并从中删除值。

多维数组是数组的数组 datafloat[][]对象的数组; data[i]float[]对象的数组, data[i][j]float对象的数组。 您需要将data[i][j]转换为列表,而不是将data转换为列表。

此外,您无法直接从Arrays.asList()返回的列表中删除项目,因为列表由数组直接支持,无法调整大小。 相反,您必须填充ArrayList ,删除元素,然后转换回数组并替换原始(请参阅此问题

最后,您正在使用一组基元( float s),您需要将float[]转换为ArrayList<Float>并再次返回。 这不是微不足道的; 这个问题可能有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM