【问题标题】:Removing items from a multi dimensional array in Java从Java中的多维数组中删除项目
【发布时间】:2011-12-14 17:32:57
【问题描述】:

我正在尝试从 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;
    }
}

【问题讨论】:

  • toArray() 返回一个Object[],因此您不能将其影响到float[][][]。
  • @talnicolas:好吧,如果他投射它,他可以......但无论如何这不是 OP 的问题:他试图做的事情不会奏效,因为他创建的 List由 float[][][] 支持,因此如果他尝试删除现有元素会抛出 UnsupportedOperationException (但即使在那里“删除”的代码也是坏了,因为他试图从 float[][] 列表中删除 Float)。看我的回答:)

标签: java arrays list


【解决方案1】:

首先,下面的方法并没有按照你的想法做:

//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 em> 方法检查它是否包含任何等于您包装的 Float 的元素。它检查整个列表并没有找到任何 Float,因为... 你有一个 float[][] 列表。所以基本上你的代码永远不会从列表中删除任何元素。

但无论如何,你应该知道应该在 remove 方法中找到一个匹配的元素,你会得到一个 UnsupportedOperationException因为 Arrays.asList 只是简单地包装了您的数组,而您的“列表”仍然支持 float[][][] 数组。而且你不能调整数组的大小。

然后,无论如何,您通常无法使用 == 比较浮点数:

if (data[i][j][k] == data[i][j][k+1]) {

因为它通常是检查两个浮点数是否相等的糟糕方法。应使用 epsilon 比较浮点数(并且您应始终跟踪错误传播)。

关于你的最后一行,你可以转换回 float[][][] 但这没有意义,因为你创建的 float[][] 列表第一个由您原来的 float[][][] 支持并且不能修改(嗯,您可以修改单个元素,但不能调整它的大小)。

【讨论】:

  • 这是迄今为止最好的解释
【解决方案2】:
List points = Arrays.asList(data);

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

但是你试图达到你的要求的方式是不可能的并且在逻辑上是无效的。

听起来您必须将数组转换为列表列表。当您在删除元素后将其转换回三维数组时,这在逻辑上是有意义的,因为会跟踪维度。

【讨论】:

    【解决方案3】:

    难道不是因为你试图推回一个三维数组吗?

    您需要循环遍历填充维度 2 和 3、1 乘 1 的数组。

    整个想法似乎过于复杂,因为您需要在删除值后知道尺寸,我认为您最好维护 3d 数组并从中删除值。

    【讨论】:

    • 他不是在向 3D 数组添加数据,而是从中删除数据。
    【解决方案4】:

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

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

    最后,您正在使用一组基元 (floats),您需要从 float[] 转换为 ArrayList&lt;Float&gt; 并再次转换回来。这不是微不足道的。 this question 可能会有所帮助

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 2017-05-11
      • 1970-01-01
      • 2018-07-26
      • 2014-09-03
      • 1970-01-01
      • 2021-04-24
      • 2019-05-02
      • 1970-01-01
      相关资源
      最近更新 更多