删除两个数组中数值接近的元素,然后删除相同的元素

花开花折 2016-04-18 08:03:26
1:现有两个数组,比较两个数组(数组1,数组2)中的元素大小,如两者差值在10以内,删除数组2中元素,(数组1中元素保留)
2:两个数组中可能包含多个差值小于10的元素;
3:比较完成后将数组2中剩余元素添加到数组1中,便于下次数组1 与数组3比较

...全文
372 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
花开花折 2016-04-21
  • 打赏
  • 举报
回复
引用 7 楼 Yokeqi 的回复:
逻辑就变成这样:数组2中的任意一个点p,如果数组1中的所有点与点P都不满足楼主说的<10的条件,那么点P到最后也就是不会被删除的点,所以直接将点p加入到数组1中。 for (i = 0; i < count; i++) { if (Math.Abs(list1[i].X - p.X) < 10 || Math.Abs(list1[i].Y - p.Y) < 10) { // 一旦在列表1中存在一个点list[i],与p的条件成立,那么这个p点肯定最后是要被删除的点。 break; } }
修改下,两层for 循环,且在第二层for内当有相同时,使j=0;再次重新开始,因为数组内存在多少相同的数据。
xuzuning 2016-04-19
  • 打赏
  • 举报
回复
foreach(var a in A)
{
  B = B.Where(b => Match.Abs(a.X - b.X) > 10 || Match.Abs(a.Y - b.Y) > 10).ToArray();
}
A = A.Concat(B).ToArray();
枫0子K 2016-04-19
  • 打赏
  • 举报
回复
另外可能要提的一个点,就是既然用了C#,就不要纠结数组还是List的问题,技术是为了解决问题而产生的。 如果现有的数组1已经一个数组,那么你可以通过List的构造函数来转换。 List list1= new List(array1);// array1 是数组类型 array1 = list1.ToArray();//如果返回的类型也是数组,可以通过List.ToArray()方法得到数组对象。
枫0子K 2016-04-19
  • 打赏
  • 举报
回复
逻辑就变成这样:数组2中的任意一个点p,如果数组1中的所有点与点P都不满足楼主说的<10的条件,那么点P到最后也就是不会被删除的点,所以直接将点p加入到数组1中。 for (i = 0; i < count; i++) { if (Math.Abs(list1[i].X - p.X) < 10 || Math.Abs(list1[i].Y - p.Y) < 10) { // 一旦在列表1中存在一个点list[i],与p的条件成立,那么这个p点肯定最后是要被删除的点。 break; } }
枫0子K 2016-04-19
  • 打赏
  • 举报
回复
#3楼的方式应该就是了,不过还是偏复杂麻烦点。 楼主的问题可以转化为,以数组1为基准,其它数组向数组1增加节点这样的问题。所以可以看到,数组1应该会是动态的,采用动态的类型List更加适合,而其他数组保持原类型也没问题。 好,关键循环逻辑如下,假如定义一个方法MergeNode来做这个合并的事.
public void MergeNode(List<Point> list1, Point[] list2)
{
    var count = list1.Count;
    int i = 0;
    foreach (Point p in list2)
    {
        for (i = 0; i < count; i++)
        {
            if (Math.Abs(list1[i].X - p.X) < 10 || Math.Abs(list1[i].Y - p.Y) < 10)
            {
                break;
            }
        }

        if (i >= count)
        {
            list1.Add(p);
        }
    }
}
baby0112 2016-04-19
  • 打赏
  • 举报
回复
定义键值对不是更好些么
花开花折 2016-04-19
  • 打赏
  • 举报
回复
引用 3 楼 CookiesKnight 的回复:
1. 定义结构体,struct mypoint 里面包含坐标float X和 float Y; 2. 定义mypoint类型的数组myarray1[ N ]和myarry2[ N ]; (数组长度你也不说清楚,不一样也可以?) 其实这里用List<>会好得多,原因见后面。 3. 循环判断myarray1中第 i 个点X,Y值与myarray2中的第 j 个点的X,Y值的差值,如果都小于10,则删除第 j 个点, 比如 if ( Math.Abs( myarray1[i].X - myarray2[j].X) > 10 && Math.Abs( myarray1[i].Y - myarray2[j].Y) > 10 ) { deletepoint( myarray2[], j ); } 。删除可以写一个删除的函数。(其实一开始就用list<>定义两组数据会好一些,因为list<>操作里面有删除下标为index的数据的操作。) 4. 把myarray2的剩余数据加入myarray1中。这里如果用数组来操作也是比较麻烦的,因为数组长度的问题,简单的办法就是重新定义一个数组,它的长度等于两个数组长度的和。而list<>可以任意加减的。 思路基本就是这样了,自己到VS里面写然后调试吧。
1: 两个数组长度是不一样的; 2: 现在有写一个实现此功能的方法,用的大概也就上面 的思路,用了两层for 循环来实现的,但总感觉思路不太好,想看看各位的思路。 3:晚点上代码,你帮我看看呗,谢谢。
CookiesKnight 2016-04-18
  • 打赏
  • 举报
回复
1. 定义结构体,struct mypoint 里面包含坐标float X和 float Y; 2. 定义mypoint类型的数组myarray1[ N ]和myarry2[ N ]; (数组长度你也不说清楚,不一样也可以?) 其实这里用List<>会好得多,原因见后面。 3. 循环判断myarray1中第 i 个点X,Y值与myarray2中的第 j 个点的X,Y值的差值,如果都小于10,则删除第 j 个点, 比如 if ( Math.Abs( myarray1[i].X - myarray2[j].X) > 10 && Math.Abs( myarray1[i].Y - myarray2[j].Y) > 10 ) { deletepoint( myarray2[], j ); } 。删除可以写一个删除的函数。(其实一开始就用list<>定义两组数据会好一些,因为list<>操作里面有删除下标为index的数据的操作。) 4. 把myarray2的剩余数据加入myarray1中。这里如果用数组来操作也是比较麻烦的,因为数组长度的问题,简单的办法就是重新定义一个数组,它的长度等于两个数组长度的和。而list<>可以任意加减的。 思路基本就是这样了,自己到VS里面写然后调试吧。
花开花折 2016-04-18
  • 打赏
  • 举报
回复
备注2:其它也就是比较数组1 2 中X及Y的值,当两者相减的绝对值都小于10时,删除数组2中对应的数组元素 谢谢
花开花折 2016-04-18
  • 打赏
  • 举报
回复
备注:数组1 2中元素不能进行排序处理,数组中的元素值是结构体,包含X Y坐标值,XY对应一个点,所以不能排序 谢谢

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧