求比较两组数据差异算法代码(分少选一位最优代码送荔枝10斤)

yzmsb11 2015-05-24 05:42:25
第一组:
98.9 6.6
90.5 675.2
85.8 562
76.7 45.8
70.9 45.8
第二组
98.9 6.6
91.8 50
90.5 375.2
87.8 88.88
85.8 562
70.9 45.8

---------------------
求实现下面需求结果的C#实现代码(或更好的说明数据变化的算法代码也行):

输出新增 :
91.8 50
87.8 88.88
输出改变:
90.5 -300
输出消失(可能有多行):
76.7 45.8


...全文
347 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
格拉 2015-05-26
  • 打赏
  • 举报
回复
引用 11 楼 yzmsb11 的回复:
[quote=引用 6 楼 Z65443344 的回复:] 荔枝10斤? 等邮到早放坏了吧
不会的,这个我寄过的[/quote]
xuzuning 2015-05-26
  • 打赏
  • 举报
回复
第一个循环可简化为

            foreach (var o in b)
            {
                double v;
                if (a.TryGetValue(o.Key, out v))
                {
                    if (o.Value != v) Console.WriteLine("改变: {0} {1}", o.Key, o.Value - v);
                }
                else Console.WriteLine("新增: {0} {1}", o.Key, o.Value);                
            }
荔枝 就犒劳你了
xuzuning 2015-05-26
  • 打赏
  • 举报
回复
用 Dictionary<double,double> 这样写
            var a = new Dictionary<double,double>()
                {
                    {98.9,    6.6},
                    {90.5,    675.2},
                    {85.8,    562},
                    {76.7,   45.8},
                    {70.9,   45.8},
                };
            var b = new Dictionary<double,double>()
                {
                    {98.9,    6.6},
                    {91.8,    50},
                    {90.5,    375.2},
                    {87.8,    88.88},
                    {85.8,    562},
                    {70.9,    45.8},
                };
            foreach (var o in b)
            {
                if (!a.ContainsKey(o.Key)) Console.WriteLine("新增: {0} {1}", o.Key, o.Value);
                else
                {
                    double v;
                    a.TryGetValue(o.Key, out v);
                    if (o.Value != v) Console.WriteLine("改变: {0} {1}", o.Key, o.Value - v);
                }
            }
            foreach (var o in a)
            {
                if (!b.ContainsKey(o.Key)) Console.WriteLine("消失: {0} {1}", o.Key, o.Value);
            }
yzmsb11 2015-05-26
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
这个两组Dictionary<double,double>不就搞定了?
是的,但两组数长短和位置不固定,我有点强迫
引用 8 楼 xuanbg 的回复:
如果98.9 6.6里面的98.9小数位数固定的话,最好转成整数。
小数的,不知道怎么比较
道玄希言 2015-05-25
  • 打赏
  • 举报
回复
額, 我其实是来看谁收荔枝的. 这个问题, 主要还是看哪个算法比较好吧.
於黾 2015-05-25
  • 打赏
  • 举报
回复
荔枝10斤? 等邮到早放坏了吧
xuzuning 2015-05-25
  • 打赏
  • 举报
回复
可以使用 Dictionary<double,double> 或 List<double[]> 来做(后者需要重载 ==) 但都需要两个循环(不是嵌套的) 考虑到你的数据是按第一列降序排列的,给一个一趟循环的写法

            var a = new double[,]
                {
                    {98.9,    6.6},
                    {90.5,    675.2},
                    {85.8,    562},
                    {76.7,   45.8},
                    {70.9,   45.8},
                };
            var b = new double[,]
                {
                    {98.9,    6.6},
                    {91.8,    50},
                    {90.5,    375.2},
                    {87.8,    88.88},
                    {85.8,    562},
                    {70.9,    45.8},
                };

            int i = 0;
            int j = 0;
            while(i < b.Length / 2)
            {
                if (j >= a.Length || b[i, 0] > a[j, 0])
                {
                    Console.WriteLine("新增 {0} {1}", b[i, 0], b[i, 1]);
                    j--;
                } 
                else if (b[i, 0] == a[j, 0])
                {
                    if (b[i, 1] != a[j, 1])
                    {
                        Console.WriteLine("改变 {0} {1}", b[i, 0], b[i, 1] - a[j, 1]);
                    }
                }
                else if (b[i, 0] < a[j, 0])
                {
                    Console.WriteLine("消失 {0} {1}", a[j, 0], a[j, 1]);
                    j++;
                }
                i++;
                j++;
            }
yzmsb11 2015-05-25
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
荔枝10斤? 等邮到早放坏了吧
不会的,这个我寄过的
yzmsb11 2015-05-25
  • 打赏
  • 举报
回复
引用 1 楼 hjkl950217 的回复:
这个不是太难吧。。不建议你直接问别人要代码,不然之后你很难再改动了。。你可以这样,,准备A B两个数组或集合。。然后A[0]开始对比另一个B里的所有数据。。说白了就是2层循环嵌套。。。之中可能遇到的改动了 消失了 就看你对比的时候怎么弄了。。比如说消失 是B的在A里没有呢?还是反过来? 这些只有你自己写最好。。。。。 你的数据是一对一对的对吧。。建议用字典。。就是字典翻译过后的那个类,,是一个键值对,,就能一对一对的对比了
谢谢,主要是我代码组织能力有点弱...
yzmsb11 2015-05-25
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
可以使用 Dictionary<double,double> 或 List<double[]> 来做(后者需要重载 ==) 但都需要两个循环(不是嵌套的) 考虑到你的数据是按第一列降序排列的,给一个一趟循环的写法

            var a = new double[,]
                {
                    {98.9,    6.6},
                    {90.5,    675.2},
                    {85.8,    562},
                    {76.7,   45.8},
                    {70.9,   45.8},
                };
            var b = new double[,]
                {
                    {98.9,    6.6},
                    {91.8,    50},
                    {90.5,    375.2},
                    {87.8,    88.88},
                    {85.8,    562},
                //    {70.9,    45.8},
                };

            int i = 0;
            int j = 0;
            while(i < b.Length / 2)
            {
                if (j >= a.Length || b[i, 0] > a[j, 0])
                {
                    Console.WriteLine("新增 {0} {1}", b[i, 0], b[i, 1]);
                    j--;
                } 
                else if (b[i, 0] == a[j, 0])
                {
                    if (b[i, 1] != a[j, 1])
                    {
                        Console.WriteLine("改变 {0} {1}", b[i, 0], b[i, 1] - a[j, 1]);
                    }
                }
                else if (b[i, 0] < a[j, 0])
                {
                    Console.WriteLine("消失 {0} {1}", a[j, 0], a[j, 1]);
                    j++;
                }
                i++;
                j++;
            }
谢谢版主回复,过漏 {70.9, 45.8},出来的结果就不对了,两组数据长短不固定的
software_artisan 2015-05-25
  • 打赏
  • 举报
回复
如果98.9 6.6里面的98.9小数位数固定的话,最好转成整数。
  • 打赏
  • 举报
回复
荔枝10斤是什么鬼
  • 打赏
  • 举报
回复
这个两组Dictionary<double,double>不就搞定了?
iyomumx 2015-05-24
  • 打赏
  • 举报
回复
长空X 2015-05-24
  • 打赏
  • 举报
回复
这个不是太难吧。。不建议你直接问别人要代码,不然之后你很难再改动了。。你可以这样,,准备A B两个数组或集合。。然后A[0]开始对比另一个B里的所有数据。。说白了就是2层循环嵌套。。。之中可能遇到的改动了 消失了 就看你对比的时候怎么弄了。。比如说消失 是B的在A里没有呢?还是反过来? 这些只有你自己写最好。。。。。 你的数据是一对一对的对吧。。建议用字典。。就是字典翻译过后的那个类,,是一个键值对,,就能一对一对的对比了

110,561

社区成员

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

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

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