1. 程式人生 > >C# 實現集合A的任意一個元素都是集合B的元素——子集

C# 實現集合A的任意一個元素都是集合B的元素——子集

1.業務需求

存在一個集合A:{“asd”,“dss”,"254"}和集合B:{“asd”,“dss”,"254","25411"}。判斷集合A是否是集合B的子集。

2.業務分析

遍歷A集合中的每一個元素,看是否B集合中是否存在該元素。

3.演算法設計

問題:集合A是否為集合B的子集?

解決方案:定義兩個變數,分別記錄集合A的數量、集合A在集合B中的數量。如果兩個數量相等,則退出集合A是集合B的子集,反之,集合A不是集合B的子集。

4.介面設計


5.具體實現

(1)定義兩個集合:集合A、集合B。存放集合A、B中的資料。

        /// <summary>
        /// 集合A
        /// </summary>
        private string[] subsetA;
        /// <summary>
        /// 集合B
        /// </summary>
        private string[] subsetB;

(2)在提交按鈕事件中完成一下三件事:

①獲取集合A和集合B的資料。

②在集合A中遍歷集合B,並判斷集合A是否為集合B的子集。

③如果集合A不是集合B的子集,輸出集合A中那些元素不在集合B中。

        private void btnSubset_Click(object sender, EventArgs e)
        {
            string strA = txtSubsetA.Text;
            string strB = txtSubsetB.Text;
            if(txtSubsetA.Text!="")
            {
                subsetA = strA.Split(',');
            }
            else 
            {
                subsetA=null;
            }
            if (txtSubsetB.Text != "")
            {
                subsetB = strB.Split(',');
            }
            else
            {
                subsetB = null;
            }

            if (subsetB != null)
            {
                if (IsSubset(subsetA, subsetB))
                {
                    txtMessage.Text = "";
                    txtMessage.Text = "集合A:" + strA + "是集合B:" + strB + "的子集";
                }
                else
                {
                    string strNotInB = "";
                    string[] strArray = WhichElementInAIsNotInB(subsetA, subsetB);
                    if (strArray != null)
                    {
                        foreach (string item in strArray)
                        {
                            if(item!=null)
                            strNotInB += item + ",";
                        }
                    }
                    txtMessage.Text = "";
                    txtMessage.Text = "集合A:" + strA + "中" + strNotInB + "不在集合B:" + strB + "中";
                }
            }
            else 
            {
                txtMessage.Text = "集合B為空";
            }

        }
        /// <summary>
        /// A是B的子集嗎
        /// </summary>
        /// <param name="a">A集合</param>
        /// <param name="b">B集合</param>
        /// <returns>True是FALSE不是</returns>
        public bool IsSubset(string[] a, string[] b)
        {
            int aCount = 0, existCount = 0;  //A集合元素的和     A集合元素存在B集合的個數
            foreach (string elementA in a)
            {
                if (elementA != null)
                {
                    foreach (string elementB in b)
                    {
                        if (elementA == elementB)
                        {
                            existCount++;
                            break;
                        }
                    }
                    aCount++;
                }
                else
                { break; }
            }
            if (aCount == existCount)
            { return true; }
            else
            { return false; }
        }
 /// <summary>
        /// A集合中哪些元素不是B集合的
        /// </summary>
        /// <param name="a">A集合</param>
        /// <param name="b">B集合</param>
        /// <returns></returns>
        public string[] WhichElementInAIsNotInB(string[] a, string[] b)
        {
            string[] result=new string[100];
            int notExistCount=0;
            foreach (string elementA in a)
            {
                bool isExist = false;
                if (elementA != null)
                {
                    foreach (string elementB in b)
                    {
                        if (elementA == elementB)
                        {
                            isExist = true;
                            break;
                        }
                    } 
                }
                else
                { break; }
                if (!isExist)
                {
                    result[notExistCount] = elementA;
                    notExistCount++;
                }
            }
            return result;
        }

6.效果演示


筆者總結

本次知識很簡單,但是我發現數學問題經常會以各種各樣的形式出現在我們程式碼編寫中,無論是誰,能利用數學思維去解決生活中的實際問題,都是棒棒的,我也相信這是當初我們老師教授我們知識初衷之一吧。