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

4

我正在尝试从一个三维数组中删除项目。

我知道最好的方法之一是将数组转换为列表,然后在迭代原始数组时从列表中删除这些项目,然后将列表转换回数组并返回它。

我尝试过这样做,但在返回数组时出现了类型不匹配的错误。我怀疑在从数组转换为列表时没有对维度进行处理。

有什么建议吗?

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;
    }
}

toArray() 返回一个 Object[],所以你不能将其赋值给 float[][][] - talnicolas
@talnicolas:如果他进行了强制转换,他就可以这样做...但无论如何,这不是OP的问题:他试图做的事情不会起作用,因为他创建的Listfloat [] [] []支持,因此如果他尝试删除现有元素,它会抛出UnsupportedOperationException(但即使在那里,“删除”代码也是错误的,因为他试图从float [] [] 列表中删除Float)。请参见我的答案 :) - TacticalCoder
4个回答

2

首先,以下方法并不是你想象中的那样:

//Change the array to a list
List points = Arrays.asList(data);

顺便说一下,一个好的集成开发环境会自动为您转换为以下内容:
List<float[][]> points = Arrays.asList(data);

所以,当你下次执行以下操作时:

points.remove(data[i][j][k])

发生的情况是,data[i][j][k]基本类型被自动装箱为Float包装类,然后remove方法检查它是否包含任何等于您封装的Float的元素。它检查整个列表,因为...您有一个float[][]列表。因此,基本上您的代码永远不会从列表中删除任何元素。
但无论如何,您应该知道,如果在remove方法中找到与之匹配的元素,您将得到UnsupportedOperationException,因为Arrays.asList仅包装您的数组,而您的“列表”仍由float [] [] []数组支持。您无法调整数组大小。
然后,无论如何,您通常无法使用==比较浮点数:
if (data[i][j][k] == data[i][j][k+1]) {

对于比较两个浮点数是否相等,通常使用“==”的方法是不可取的。应该使用一个极小值epsilon来比较浮点数(并且你应该时刻追踪误差传播)。

关于您最后一行的问题,您可以将其强制转换为 float [] [] [] ,但这是无意义的,因为您在第一次创建的 float [] [] 列表是由原始的 float [] [] [] 支持的,不能修改大小(虽然您可能会修改单个元素)。


这绝对是最好的解释。 - rogermushroom

1
List points = Arrays.asList(data);

正在创建二维数组的列表(points),而不是您需要的 float

但是,您尝试实现您的要求的方式是不可能的,逻辑上是无效的。

听起来像是您必须将您的数组转换为列表的列表的列表。在删除元素后将其转换回三维数组时,这在逻辑上是有意义的,因为它保持了尺寸的跟踪。


0

这是因为您试图将数据推回到三维数组中,对吗?

您需要循环遍历数组,逐个填充第2和第3维。

整个想法似乎过于复杂,因为在删除值后,您需要知道数组的维度。我认为最好还是保持3D数组并从中删除值。


他并没有向3D数组中添加数据,而是从中删除数据。 - talnicolas

0

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

此外,你不能直接从Arrays.asList()返回的列表中删除项,因为该列表直接由数组支持,而数组大小无法调整。相反,你需要填充一个ArrayList、删除元素,然后再转换回数组并替换原始数据(详见this question)。

最后,你正在使用原始数组(float),你需要将其从float[]转换为ArrayList<Float>,然后再转换回来。这并不是一件简单的事情;这个问题可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接