簡體   English   中英

從多維數組中刪除重復項的最佳方法?

[英]Best way to remove duplicates from 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}

    這就是我獲取數據的方式,我無法更改初始排序機制。

  • 二維是目前的極限,但數組可以有數千個點。

最簡單的答案:成對比較數組的元素並刪除重復項。 這不會很好地擴展,但它可能不需要。

更復雜的:看類似radix sort的東西。 按子數組的第一個和第二個元素排序后,您可以遍歷整個數組並刪除重復項。 這將更好地擴展,但它很容易被矯枉過正(取決於你的情況)。

最佳(可能):創建一組數組元素。 穿過陣列; 對於每個元素,檢查它是否已經在集合中。 如果是,請將其從陣列中刪除。 如果沒有,請將其添加到集合中並繼續。 這可能是最好的方法,除非復制數組是空間問題。

您不需要制作所有點的集合 - 只需為每個 X 設置 Y 值,因為它們是在 X 上排序的。使用 HashSet 需要自動裝箱每個值 - 在效率方面,請改用TDoubleHashSet 這可能是接近最優的——部分取決於重復的頻率。

這與輸入的順序一樣,但是當給定 X 值有多個 Y 值時,它們可能是 output,順序與輸入不同。

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

創建一組“數組”元素。 當包含相等的元素洞察力時,'array' 元素應該返回相等的 true。

您可以做的一件簡單的事情是在將新元素添加到數組之前進行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM