假设我有一个数组:
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}
这就是我获取数据的方式,我无法改变初始排序机制。
两个维度是当前限制,但数组可以有数千个点。
答案 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)
您可以做的一件简单事情是在向阵列添加新元素之前进行检查。