从多维数组中删除重复项的最佳方法是什么?

时间:2011-07-06 18:58:31

标签: java multidimensional-array

假设我有一个数组:

double[][] points = {{0.0, 0.0}, {1.0, 1.0}, {1.0, 1.0},  {2.0, 2.0}};

我想创建一个没有重复条目{1.0, 1.0}的新数组 - 最好的方法是什么?

其他信息:

  • 数组已排序,但仅由第一个组件排序,因此可以使用

    {1.0, 2.0}, {1.0, 1.0}, {1.0, 2.0}
    

    这就是我获取数据的方式,我无法改变初始排序机制。

  • 两个维度是当前限制,但数组可以有数千个点。

5 个答案:

答案 0 :(得分:3)

最简单的答案:成对比较数组的元素并删除重复项。这不会很好地扩展,但可能不需要。

更复杂:看看像radix sort这样的东西。在按照子阵列的第一个元素和第二个元素进行排序后,您可以遍历整个数组并删除重复项。这将更好地扩展,但它可能很容易过度(取决于您的情况)。

最好(可能):创建一组数组元素。穿过阵列;对于每个元素,检查它是否已经在集合中。如果是,请将其从阵列中删除。如果没有,请将其添加到集合中并继续运行。这可能是最好的方法,除非复制数组是一个空间问题。

答案 1 :(得分:2)

你不需要创建一组所有的点 - 只是每个X的Y值,因为它们在X上排序。使用HashSet需要自动装箱每个值 - 在效率方面,使用{{3相反。这可能是接近最优的地方 - 部分取决于重复的频率。

这与输入一样有序,但是当给定X值有多个Y值时,它们的输出顺序可能与输入的顺序不同。

double prevPoint[];
// If efficiency matters, use Trove TDoubleHashSet instead.
HashSet<Double> set;
ArrayList<double[]> buffer;

double[][] filter(double[][] points)
{
    prevPoint = new double[]{Double.NaN, Double.NaN};
    set = new HashSet<Double>();
    // Allocate space as if there were no duplicates.
    // Tweak if expecting lots of dupes.
    buffer = new ArrayList<double[]>(points.length);
    for ( double[] point : points )
    {
        if ( prevPoint[0] != point[0] )
        {
            emitSet();
            set.clear();

        }
        set.add(point[1]);
        prevPoint = point;
    }

    // output hashset
    emitSet();

    return buffer.toArray(new double[buffer.size()][2]);
}

private void emitSet()
{
    for ( double y : set )
    {
        // optimize out array create for common case of only 1 y with the same x.
        // get rid of this complexity if efficiency not needed.
        if ( y == prevPoint[1] )
        {
            buffer.add(prevPoint);
        }
        else
        {
            buffer.add(new double[] {prevPoint[0], y});
        }
    }
}

答案 2 :(得分:1)

创建'array'元素集。当包含相同元素洞察时,'array'元素应该返回相等的true。

答案 3 :(得分:1)

答案 4 :(得分:0)

您可以做的一件简单事情是在向阵列添加新元素之前进行检查。