[英]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.