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

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

...全文
405 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对应一个点,所以不能排序 谢谢
打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/yd6ne 在IT领域,优化问题是一个广泛研究的议题,特别是在算法设计中。本文将深入探讨一个具体的优化问题——“最优合并问题”,以及如何使用C++和贪心算法来解决它。贪心算法是一种解决问题的方法,它每次做出局部最优选择,期望这些局部最优能导致全局最优解。最优合并问题的基本思想是将一系列数据集合合并成尽可能少的大集合,每个大集合内部的元素顺序必须保持原样。例如,假设我们有多个已排序的小数组,我们需要找到一种合并方式,使得合并后的数组数量最少。这是一个典型的贪心策略问题,因为我们可以每次都选择两个接近的数组进行合并,以减少总的数组数量。在C++中,我们可以利用STL(标准模板库)中的vector容器来存储和操作数据。vector是一种动态数组,支持随机访问和高效插入、删除操作,非常适合处理此类问题。以下是一般步骤:1. **数据存储**:我们需要用vector存储所有的输入数组。每个输入数组可以被表示为一个vector,其中的元素数组中数值。2. **合并策略**:接下来,我们需要定义合并策略。贪心算法的选择是每次选取当前未合并数组中长度最短的两个数组进行合并。为了实现这一点,我们可以维护一个优先队列(堆),其中存储了数组的起始索引和长度。每次取出长度最短的两个数组进行合并,并更新队列。3. **合并操作**:在C++中,我们可以使用`std::merge`函数,它将两个已排序的范围合并到一个单一的已排序的范围。这个函数保持元素的原始顺序,符合最优合并问题的要求。4. **重复过程**:直到只剩下一个大数组或无法再进行合并时,重复上述合并操作。5. **输出结果**:输出合并后的大数组即可。以下是C++代码实现的关键部分:```cpp#include #include <

111,120

社区成员

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

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

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