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

时间:2011-12-14 17:32:58

标签: java arrays list

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

据我所知,执行此操作的最佳方法之一是将数组转换为列表,并在迭代原始数组时从列表中删除这些项,然后将列表转换回数组并返回它。

我试过这个,但回到阵列时出现类型不匹配。我怀疑从数组转换到列表时我没有对尺寸做过什么。

么?

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

4 个答案:

答案 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)

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

,而不是将data[i][j]转换为列表

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

最后,您正在处理一系列基元(float s),您需要从float[]转换为ArrayList<Float>然后再转回。这不是微不足道的; this question可能有帮助