采用归并排序算法查找两个字符串数组中的不同数据

  现在项目中有需求比较两个字符串数组,找出其中不同的部分,并保存到本地txt。实现方式每个人都有自己的思路,这里提供一种通过归并排序实现的方式供大家参考。

  基本思路是数组A和数组B对比,使用数组a来保存数组A中比数组B中多的元素(即在A中存在,B中不存在的元素),b来保存数据B中比数组A中多的元素(即B中存在,A中不存在的元素)。开始需要分别调用Sort()函数对A、B数组进行排序,然后使用CompareTo从两个数组中第一个数组进行比较,当A.0(A中第一个元素)>B.0时A.CompareTo(B)==1,当A.0=B.0时A.CompareTo(B)==0,当A.0<B.0时A.CompareTo(B)==-1。通过判断A.CompareTo(B)的值来执行a.add和b.add操作,最终就能得到a、b数组,然后写入到txt就可以了。

  核心代码如下:

 /// <summary>
    /// 归并排序: 查找两个集合中的不同数据
    /// </summary>
    /// <param name="root">源数据集合</param>
    /// <param name="source">新数据集合</param>
    /// <param name="remove">需在源数据中移除的集合</param>
    /// <param name="add">需在源数据中添加的集合</param>
    public void FindDistinct(List<string> root, List<string> source, out List<string> remove, out List<string> add)
    {
        remove = new List<string>();
        add = new List<string>();

        root.Sort();
        source.Sort();
        //foreach (string str in root) Console.WriteLine(str);
        //Console.WriteLine("\r\n");
        //foreach (string str in source) Console.WriteLine(str);
        //Console.WriteLine("\r\n");

        int i = 0, j = 0;
        while (i < root.Count && j < source.Count)
        {
            switch (root[i].CompareTo(source[j]))
            {
                case -1:
                    remove.Add(root[i]); i++;
                    break;
                case 0:
                    i++; j++;
                    break;
                case 1:
                    add.Add(source[j]); j++;
                    break;
            }
        }

        if (i < root.Count)
        {
            for (int m = i; m < root.Count; m++) remove.Add(root[m]);
        }
        else if (j < source.Count)
        {
            for (int m = j; m < source.Count; m++) add.Add(source[m]);
        }

        //Console.WriteLine("\r\nroot中不同的数据:");
        //foreach (string str in remove) Console.WriteLine(str);

        //Console.WriteLine("\r\nsource中不同的数据:");
        //foreach (string str in add) Console.WriteLine(str);
    }
  调用:

        List<string> remove;
        List<string> add;
        FindDistinct(rpqlist, pdflist, out remove, out add);
        //将strArray输出到文本文件
        using (TextWriter tw = new StreamWriter(@"D:\RPQ.txt"))
        {
            int index = 0;
            foreach (string str in remove)
            {
                string s = string.Format("{0:d3}\t{1}", index, str);
                tw.WriteLine(s);
                index++;
            }
        }
        using (TextWriter tw = new StreamWriter(@"D:\PDF.txt"))
        {
            int index = 0;
            foreach (string str in add)
            {
                string s = string.Format("{0:d3}\t{1}", index, str);
                tw.WriteLine(s);
                index++;
            }
        }
        MessageBox.Show("数据对比完毕,文件已经保存到D盘!");
  这里是对归并排序算法的一个小应用,希望对大家有所帮助,不足之处请大家批评指正。


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Java编程考试常出现的型包括以下几种: 1. 字符串操作:要求学生实现字符串的常见操作,比如字符串的拼接、反转、替换、查找等。此类目考察学生对字符串的基本掌握程度以及对字符串操作方法的熟练度。 2. 线性表、栈、队列和链表:考察学生对这些数据结构的理解和熟练应用能力,比如实现这些数据结构的基本操作、应用场景分析等。 3. 树结构:要求学生实现二叉树的遍历、查找等操作,或者实现树的相关算法,比如构建哈夫曼树等。 4. 排序算法:要求学生实现常见的排序算法,比如冒泡排序、快速排序、堆排序、归并排序等,并分析其时间复杂度。 5. 查找算法:要求学生实现常见的查找算法,比如二分查找、哈希查找等,并分析其时间复杂度。 6. 分治算法:要求学生实现常见的分治算法,比如归并排序、快速排序等,并分析其时间复杂度。 以下是一些示例目及其答案: 1. 字符串操作目:将一个字符串中所有的空格替换为"%20"。 答案:可以先遍历字符串,记录空格的数量,然后计算出替换后的字符串长度,从后向前进行替换。 2. 线性表目:实现一个栈,要求支持入栈、出栈和获取栈顶元素的操作。 答案:可以使用数组或链表来实现栈,入栈操作即在栈顶插入元素,出栈操作即从栈顶删除元素,获取栈顶元素操作即返回栈顶元素。 3. 树结构目:实现一个二叉树的前序遍历。 答案:前序遍历的顺序是根节点、左子树、右子树。可以使用递归或者栈来实现前序遍历。 4. 排序算法目:实现一个快速排序算法。 答案:快速排序的基本思路是选择一个基准元素,将小于基准元素的数放在其左边,大于基准元素的数放在其右边,然后对左右两部分分别递归进行快速排序。时间复杂度为O(nlogn)。 5. 查找算法目:实现一个二分查找算法。 答案:二分查找的基本思路是将数组分成左右两部分,若查找元素小于中间元素,则在左半部分继续查找,否则在右半部分查找,直到到或者查找区间为空。时间复杂度为O(logn)。 希望这些信息能够对你有所帮助,祝你考试顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值