删除彼此太接近的数组元素
本文关键字:数组元素 接近 删除 | 更新日期: 2023-09-27 17:49:27
我有一个浮点元素数组,我试图删除彼此接近的元素。例如,如果有两个元素的间距小于0.4(例如15.1和15.3),我想要删除第二个。0.4应该是算法的输入参数。
数组已经按特定的顺序排序(不是升序/降序),我需要保持该顺序
我创建了一个ApproximateFloatComparer
类,如下所示:
public class ApproximateFloatComparer : IComparer<float>
{
public float Range { get; set; }
public ApproximateFloatComparer(float range)
{
this.Range = range;
}
public int Compare(float x, float y)
{
if (x - this.Range < y && x + this.Range > y)
return 0;
else return x.CompareTo(y);
}
}
然后创建一个重复数据删除方法:
public static List<float> Deduplicate(List<float> floats, float range)
{
var dedup = new List<float>();
var comparer = new ApproximateFloatComparer(range);
foreach (var @float in floats)
if (!dedup.Any(f => comparer.Compare(f, @float) == 0))
dedup.Add(@float);
return dedup;
}
然后合并:
var floats = new List<float>() { 5, 8, 2, 13, 6, 9, 4, 3, 2.1f, 8.6f, 2.2f };
floats = Deduplicate(floats, 0.4f);
通过一个简单的while
,用List<float>
代替array
,用扩展方法:
public static void Deduplicate(this List<float> values, float delta, int decimals)
{
int index = 0;
while (index < values.Count)
{
float value = values[index];
int i = index + 1;
while (i < values.Count)
{
if (Math.Round(Math.Abs(value - values[i]), decimals) < delta)
values.RemoveAt(i);
else
++i;
}
++index;
}
}
并使用:
List<float> values = new List<float> { 3.4f, 1, 2, 3, 4, 1.2f, 2.5f, 3.6f, 1 };
values.Deduplicate(0.4f, 5);// { 3.4f, 1, 2, 4, 2.5f }
values.Deduplicate(0.4f, 10);// { 3.4f, 1, 2, 3, 4, 2.5f }