请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?

请看下面的代码。

using System;
using System.Collections.Generic;

namespace Juxiantang
{
    public static class CollectionOperate
    {
        /// <summary>
        /// 对两个已排序的集合进行分解合并操作
        /// a中独有的存放在c.A中
        /// a,b都有的存放在c.AB中
        /// b中独有的存放在c.B中
        /// </summary>
        /// <typeparam name="T">必须是可以比较的类型</typeparam>
        /// <param name="a">集合a</param>
        /// <param name="b">集合b</param>
        /// <returns>返回c(A, AB, B)</returns>
        public static ThreeCollection<T> BreakUpSortedCollection<T>(IEnumerable<T> a, IEnumerable<T> b)
            where T : IComparable<T>
        {
            IEnumerator<T> ia = a.GetEnumerator();
            IEnumerator<T> ib = b.GetEnumerator();
            ThreeCollection<T> c = new ThreeCollection<T>();
            if (!ia.MoveNext()) //a集合为空
            {
                c.B.AddRange(b);
                return c;
            }
            if (!ib.MoveNext()) //b集合为空
            {
                c.A.AddRange(a);
                return c;
            }
            
            ia.Reset();
            ib.Reset();
            ia.MoveNext();
            ib.MoveNext();
            Lookup<T>(ia, ib, c.A, c.AB, c.B);
            return c;
        }

/// <summary>
        /// 针对集合a的当前值a.Current,对比集合b的当前值b.Current
        /// 根据对比情况将a.Current或b.Current放入A, AB, B中
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="ia"></param>
        /// <param name="ib"></param>
        /// <param name="A"></param>
        /// <param name="AB"></param>
        /// <param name="B"></param>
        private static void Lookup<T>(IEnumerator<T> ia, IEnumerator<T> ib, List<T> A, List<T> AB, List<T> B)
            where T : IComparable<T>
        {
            int compareResult = (ia.Current.CompareTo(ib.Current));
            if (compareResult < 0) //a.Current < b.Current
            {
                A.Add(ia.Current);
                if (ia.MoveNext())
                {
                    Lookup<T>(ia, ib, A, AB, B);
                }
                else
                {
                    do
                    {
                        B.Add(ib.Current);
                    } while (ib.MoveNext());
                }
            }
            else if (compareResult == 0) //a.Current == b.Current
            {
                AB.Add(ia.Current);
                if (!ia.MoveNext())
                {
                    while (ib.MoveNext())
                    {
                        B.Add(ib.Current);
                    }
                }
                else if (ib.MoveNext())
                {
                    Lookup<T>(ia, ib, A, AB, B);
                }
            }
            else // a.Current > b.Current
            {
                B.Add(ib.Current);
                if (ib.MoveNext())
                {
                    Lookup<T>(ib, ia, B, AB, A);
                }
                else
                {
                    do
                    {
                        A.Add(ia.Current);
                    } while (ia.MoveNext());
                }
            }
        }
    }

/// <summary>
    /// 简单将A, AB, B集合在一起的实体
    /// </summary>
    /// <typeparam name="T">泛型</typeparam>
    public class ThreeCollection<T>
    {
        List<T> a = new List<T>();
        List<T> ab = new List<T>();
        List<T> b = new List<T>();

public List<T> B
        {
            get { return b; }
            set { b = value; }
        }

public List<T> AB
        {
            get { return ab; }
            set { ab = value; }
        }

public List<T> A
        {
            get { return a; }
            set { a = value; }
        }
    }

public class Program
    {
        static void Main()
        {
            int[] b = { 1, 2, 3, 4, 5, 6 };
            int[] a = { 8, 10, 11 };
            ThreeCollection<int> c = CollectionOperate.BreakUpSortedCollection<int>(a, b);
            System.Console.Write("A = ");
            Print<int>(c.A);
            System.Console.Write("AB = ");
            Print<int>(c.AB);
            System.Console.Write("B = ");
            Print<int>(c.B);
            System.Console.ReadLine();
        }

static void Print<T>(IEnumerable<T> list) where T : IFormattable
        {
            foreach (T o in list)
            {
                System.Console.Write(o.ToString());
                System.Console.Write(" ");
            }
            System.Console.Write("\n");
        }
    }
}

转载于:https://www.cnblogs.com/baiguli/archive/2007/04/07/704089.html

请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?...相关推荐

  1. 【8558】编写算法建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知存储空间)

    关注公众号程序猿从入门到入土查询更方便哦 编写算法建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知存储空间) #include<bits/stdc++.h& ...

  2. Java编程验证哥德巴赫猜想:任何一个大于6的偶数,都能分解成两个质数的和

    package com.pzhu.demo;import java.util.Scanner;public class Goldbach {//Java编程验证哥德巴赫猜想:任何一个大于6的偶数,都能 ...

  3. 借用该函数验证哥德巴赫猜想:任意一个大的偶数都可以分解成两个素数之和。

    定义一个函数,实现判断某个整数是否是素数.借用该函数验证哥德巴赫猜想:任意一个大的偶数都可以分解成两个素数之和.从键盘输入一个偶数,输出该偶数的两个素数之和. 代码段: #include <io ...

  4. 数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数

    数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两个素数之和.比如:24=5+19,其中5和19都是素数.本实验的任务是设计一个程序,验证20亿以内的偶数 ...

  5. 华为机试——将一个数分解成两个质数之和

    题目描述 * 题目描述:数字分解,将一个数字分解成两个质数相加 * 输入描述:给定数字 * 输出描述:两个质数之和 * 输入示例:10 * 输出示例:10=3+7 代码实现 /************ ...

  6. 面试经典算法-将大于2的某一个数分解成两个素数之和

    将大于2的某一个数分解成两个素数之和 [面试题]输入一个大于2的偶数n,将n分解成为两个素数之和,有几对就输出几对.(注意 :1 不是素数) #include <stdio.h>/*子算法 ...

  7. [转载]:合并两个已排序好的int数组,并排序返回c#实现

    http://www.cnblogs.com/relang99/archive/2008/09/09/1287572.html /// <summary>         /// 两个从小 ...

  8. c语言偶数分解成两个素数,如何用C语言验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和....

    题目: 如何用C语言验证2000以内的哥德巴赫猜想,对于任何大于4的偶数均可以分解为两个素数之和. 我是大一新生,代码不能太复杂 解答: //首先生成质数表,然后双重循环输出2000以内所有偶数的两个 ...

  9. python合并列表重新排序_python – 将两个已排序的列表合并为一个更大的排序列表...

    我正在尝试创建一个合并函数,将在我正在进行的合并排序中使用. 我遇到了一些麻烦,我似乎无法找到错误. 我评论它试图向你们展示我的思考过程: def merge(aList, bList): newLi ...

最新文章

  1. window 删除顽固 node_modules
  2. 薪酬管理的特点和注意事项[转]
  3. 怎么样武直不打_打HPV疫苗期间意外怀孕?怎么办?
  4. 如何提高Google Adsense单价:点击率篇
  5. yandexbot ip列表整理做俄罗斯市场的站长可以关注一下
  6. Android Studio安装问题及填坑
  7. assimp android build,使用Android Studio+CMakeLists编译assimp
  8. python之地基(四)
  9. python中的实用模块_python中的常用模块
  10. JAVA导出EXCEL表格
  11. 如何成为一名优秀的测试/开发程序员?专注谋定而后动......
  12. 木纤维增强聚丙烯复合材料:压缩和注塑成型工艺
  13. 基于ZigBee的智能监控系统-上位机代码
  14. SSL: CERTIFICATE_VERIFY_FAILED
  15. 你所不知的Redis三个特殊类型
  16. 排球计分规则功能说明书
  17. Invalid -Xlog option ‘-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=3
  18. Windows 工具栏ToolBar
  19. matlab 打包封装,matlab中如何封装打包成exe文件
  20. 什么是mysql锁表

热门文章

  1. VC++判断文件或文件夹是否存在(转)
  2. (4.28)for xml path 在合并拆分上的作用演示
  3. ansible基本模块-shell
  4. Spring:笔记整理(1)——HelloWorld
  5. UML总结---UML九种图关系说明
  6. IIS 之 未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。...
  7. 自己常用的wireshark过滤条件
  8. 【原创】关于MATLAB中imagesc函数图像保存的问题
  9. ES6学习笔记(二):教你玩转类的继承和类的对象
  10. javascript设计模式-Constructor(构造器)模式