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

  现在项目中有需求比较两个字符串数组,找出其中不同的部分,并保存到本地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盘!");

  这里是对归并排序算法的一个小应用,希望对大家有所帮助,不足之处请大家批评指正。

时间: 2024-09-23 05:13:51

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

android-如何在常规字符串数组中打印 sqlite 数据?

问题描述 如何在常规字符串数组中打印 sqlite 数据? 我写下面的代码来填充数据库,现在我想在一个数组中复制数据,然后在 arrayadapter 打印出来. 我使用 tabactivity,这是我找到的最好的解决方法. public void insertIntoTable(){ try{ mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null); mydb.execSQL("INSERT INTO " + TA

动态开辟指定数量的线程来查找动态开辟的数组中的1000000数据中的值

 1.项目包结构 array.h #ifndef _ARRAY_H_ #define _ARRAY_H_   /************************************************************************/ /* 初始化数组                                                          */ /************************************************

如何判断一个字符串数组中是否存在两个字符串序列相等?

问题描述 如何判断一个字符串数组中是否存在两个字符串序列相等?不要用时间复杂度为O(n2)的算法,请问具体要怎么做? 解决方案 解决方案二:publicbooleancompareEqual(String[]strs){booleanflag=false;//字符串数组中是否有两个字符串相等Stringtemp="";for(inti=0;i<strs.length;i++){if(temp.contains(strs[i])){flag=true;break;//若果有重复就直

JavaScript自定义函数实现查找两个字符串最长公共子串的方法_javascript技巧

本文实例讲述了JavaScript自定义函数实现查找两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: //查找两个字符串的最长公共子串 function findSubStr(s1,s2){ var S=sstr= "" ,L1=s1.length,L2=s2.length; if (L1>L2){ var s3=s1;s1=s2,s2=s3,L1=s2.length;} for ( var j=L1;j> 0 ;j--) for ( var i= 0 ;i&

算法 优化-编写一个函数,该函数将筛选出两个字符串参数中相同的字符,并按字母序进行排序后返回

问题描述 编写一个函数,该函数将筛选出两个字符串参数中相同的字符,并按字母序进行排序后返回 本题是某欧外企面试题,下面给出一个我当时的C语言解法,希望请教各位高手们更为高效的解法. char *func(const char *s1, const char *s2) { char temp[256];//ascii_table memset(temp, 0, sizeof(temp)); char *p1 = s1, *p2 = s2; int len = 0; for(; *p1!=0; p1

高手帮忙,两个字符串数组第一个元素分别加到第二个数组的各个元素上

问题描述 高手帮忙,两个字符串数组第一个元素怎样分别加到第二个数组的各个元素上 解决方案 解决方案二:arr2[0]+arr1[0],遍历数组执行解决方案三:++引用1楼的回复: arr2[0]+arr1[0],遍历数组执行

查找字符串数组中16进制数,并转换【原创】

  查找字符串数组中16进制数,并转换 #include <stdio.h> #include <stdlib.h> #include <string.h> void string_to_hex(unsigned char* input, int input_len, unsigned char* output, int output_len) { unsigned char tmp; int i; if (input_len > output_len*2) re

数组 算法-找出两数组中不同的数据,并查看他们在以前数组中的索引值

问题描述 找出两数组中不同的数据,并查看他们在以前数组中的索引值 var aa = [1,21,21,21,28]; var bb = [3,4,27,39,21]; var cc = []; var tmp = aa.concat(bb); var o = {}; for (var i = 0; i < tmp.length; i ++){ (tmp[i] in o) ? o[tmp[i]] ++ : o[tmp[i]] = 1; } for (x in o){ if (o[x] == 1){

JS 清除字符串数组中,重复元素的实现方法_javascript技巧

JS 清除字符串数组中,重复元素的实现方法 <script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<1000; i++) { arrData[arrData.length] = String.fromCharCode(Math.floor(Math.random()*26)+97); } //document.write(arrData+"<br/&g