当前位置: 首页 > 知识库问答 >
问题:

在Java中从2D数组中删除重复项

呼延俊良
2023-03-14

所以,我有两个多维数组。

    double[][] combinations = new double[10000][3];
    double[][] uniqueCombinations = new double[100][3];

数组值示例:

[[1.233, 1.333, 0.76], [1.1, 1.333, 1.333], [0.9, 1.1, 0.9], [1.1, 1.333, 1.333]]

这就是我想要的

[[1.233, 1.333, 0.76], [1.1, 1.333, 1.333], [0.9, 1.1, 0.9]]

我想从组合中获得所有唯一的数组,并用它填充唯一的组合。

我尝试了这个函数,但它只填充了5个数组,真奇怪!

public static double[][] removeDuplicate(double[][] matrix) {
    double[][] newMatrix = new double[matrix.length][matrix[0].length];
    int newMatrixRow = 1;

    for (int i = 0; i < matrix[0].length; i++)
        newMatrix[0][i] = matrix[0][i];

    for (int j = 1; j < matrix.length; j++) {
        List<Boolean> list = new ArrayList<>();
        for (int i = 0; newMatrix[i][0] != 0; i++) {
            boolean same = true;
            for (int col = 2; col < matrix[j].length; col++) {
                if (newMatrix[i][col] != matrix[j][col]) {
                    same = false;
                    break;
                }
            }
            list.add(same);
        }

        if (!list.contains(true)) {
            for (int i = 0; i < matrix[j].length; i++) {
                newMatrix[newMatrixRow][i] = matrix[j][i];
            }
            newMatrixRow++;
        }
    }

    int i;
    for(i = 0; newMatrix[i][0] != 0; i++);

    double finalMatrix[][] = new double[i][newMatrix[0].length];
    for (i = 0; i < finalMatrix.length; i++) {
        for (int j = 0; j < finalMatrix[i].length; j++)
            finalMatrix[i][j] = newMatrix[i][j];
    }

    return finalMatrix;
}

共有1个答案

澹台文博
2023-03-14

您可以尝试基于哈希表的算法,即计算每个矩阵向量的哈希,并使用哈希键将向量索引保存在哈希图中。然后基于哈希表索引值构造一个结果矩阵。例如:

   import static org.junit.Assert.assertArrayEquals;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.junit.Test;

import com.google.common.hash.HashFunction;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;

public class ArraysCombination {

    private static double[][] COMBINATIONS = { 
            {1.233, 1.333, 0.76 }, 
            { 1.1, 1.333, 1.333 }, 
            { 0.9, 1.1, 0.9 },
            { 1.1, 1.333, 1.333 } };


    private static double[][] uniqieCombinations(double[][] all) {
        final Map<Integer,Integer> uniqueIdx = new HashMap<>();
        // hashing can be replaced with Arrays.hashCode(all[i])
        final HashFunction hashFunction = Hashing.murmur3_32(all.length);
        for (int i = 0; i < all.length; i++) {
            final Hasher hasher = hashFunction.newHasher();
            for (int j = 0; j < all[i].length; j++) {
                hasher.putDouble(all[i][j]);
            }
            final Integer hash = hasher.hash().asInt();
            if( !uniqueIdx.containsKey(hash) ) {
                uniqueIdx.put(hash, Integer.valueOf(i));
            } 
        }
        double[][] arr = new double[uniqueIdx.size()][];
        Iterator<Integer> it = uniqueIdx.values().iterator();
        for (int i=0; i < arr.length; i++ ) {
            int idx = it.next();
            arr[i] = Arrays.copyOf( all[ idx ], all[idx].length  );
        }
        return arr;
    }



    @Test
    public void shouldFindUniqueCombinations() {
        double [][] uniqueCombination = uniqieCombinations(COMBINATIONS);
        for (double[] ds : uniqueCombination) {
            System.out.println(Arrays.toString(ds));
        }
        double[][] expected  = {{1.233, 1.333, 0.76}, {1.1, 1.333, 1.333}, {0.9, 1.1, 0.9}};
        for (int i = 0; i < expected.length; i++) {
            assertArrayEquals("Wrong unique combinations", expected[i] , uniqueCombination[i], 0 );
        }
    }

}

在巨大的矩阵上仍然存在散列丢失的可能性,因此使用Google Guava提供的数据来代替数组。hashCode(所有[i])

 类似资料:
  • 问题内容: 我应该读一个包含许多不同电子邮件地址的文件,并使用数组将它们打印出来。问题是我需要消除重复的电子邮件。 我能够尝试/捕捉并打印出电子邮件地址。但是,我不确定如何删除重复项。我对散列码或如何使用Set尚不了解。任何援助将不胜感激。 这是我到目前为止的内容: 问题答案: 简单的解决方案是使用Set Java, 因此设置自动删除重复值 并且在你的代码中你拥有数组,而不是将转换数组直接使用代码

  • 问题内容: 我正在使用2D形状数组存储经度和纬度对。一方面,我必须合并两个2D数组,然后删除所有重复的条目。我一直在寻找类似于numpy.unique的函数,但是我没有运气。我一直在考虑的任何实现都看起来“没有优化”。例如,我正在尝试将数组转换为元组列表,使用set删除重复项,然后再次转换为数组: 是否有任何现有的解决方案,所以我不会重新发明轮子吗? 为了清楚起见,我在寻找: 顺便说一句,我只想使

  • 问题内容: 我使用下面的代码行遍历数据库中的一个表: 如果我打印出数组: 我会得到这个: 但是我想摆脱数组中的重复项,所以我使用 我得到下面的奇怪结果,这不是我想要的结果: 理想情况下,我认为它应该返回以下内容: 我该怎么做才能正确处理?我使用了错误的PHP语法/默认功能吗? 问题答案: 该功能将为您完成此操作。您只需要添加标志:

  • 我想在创建以下2d阵列后删除一个元素。它应该是数组的最后一个元素。

  • 这是我的数据: 使用Lodash,我如何删除具有重复id键的对象?有过滤器,地图和独特的东西,但不太确定。 我的真实数据集要大得多,有更多的键,但概念应该是一样的。

  • 我有一个问题编码这个: 编写一个名为的静态方法,该方法将整数数组作为输入,并返回一个新的整数数组,其中所有重复项都被删除。例如,如果输入数组具有元素{4,3,3,4,5,2,4},则结果数组应为{4,3,5,2} 这是我目前所做的