码迷,mamicode.com
首页 > 其他好文 > 详细

排列数据的输出

时间:2014-08-13 13:11:38      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:style   使用   os   数据   for   ar   代码   时间   

 排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个排列的算法,想不到却花费了不少时间。

   需求很简单,就是典型的排列应用。

例如输入:C0,C1,C2,C3,C4,输出C0,C1,C2,C3,C4的所有排列。

实现代码:

  /// <summary>
        /// 输出所有排列的数据
        /// </summary>
        /// <param name="columns">输入的排列的所有元素</param>
        /// <param name="columnsContain">输出元素列表,已添加的元素</param>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string CreateAllSequenceData(List<string> columns, List<string> columnsContain, string key)
        {
            StringBuilder strs = new StringBuilder();
            List<string> columnsContaininer = new List<string>();
            bool hasAddParentcolumns = false;//是否已添加上层循环传入的元素
            for (int i = 0; i < columns.Count; i++)
            {
                string item = columns[i];
                if (!hasAddParentcolumns)
                {
                    columnsContaininer.AddRange(columnsContain);
                    hasAddParentcolumns = true;
                }
                if (columnsContaininer.Count == columns.Count)//所有元素已添加,输出排列
                {
                    string value = GetSequenceKey(columnsContaininer);
                    strs.AppendLine(key + ":" + value);
                    break;
                }
                if (!columnsContaininer.Contains(item))//当前元素还没有添加到输出元素列表中
                {
                    columnsContaininer.Add(item);
                    if (columnsContaininer.Count == columns.Count)//所有元素已添加,输出排列
                    {
                        string value = GetSequenceKey(columnsContaininer);
                        strs.AppendLine(key + ":" + value);
                        break;
                    }
                    else//还有元素没有添加,递归调用
                    {
                        strs.Append(CreateAllSequenceData(columns, columnsContaininer, key));
                    }
                    columnsContaininer.Clear();//情况内部循环递归调用添加的元素
                    hasAddParentcolumns = false;
                }
            }
            return strs.ToString();
        }
        private static string GetSequenceKey(List<string> columns)
        {
            StringBuilder strs = new StringBuilder();
            for (int i = 0; i < columns.Count; i++)
            {
                strs.Append(columns[i] + "_");
            }
            return strs.ToString();
        }
        //生成所有排列
        public static string CreateAllGroupingData(List<string> columns)
        {          
            StringBuilder strs = new StringBuilder();           
            string key = GetSequenceKey(columns);
            List<string> columnsContain = new List<string>();
            strs.Append(CreateAllSequenceData(columns, columnsContain, key));
            return strs.ToString();
        }

        /// <summary>
        /// 测试代码
        /// </summary>
        public static void Test()
        {
            List<string> columns = new List<string>();
            columns.Add("c0");
            columns.Add("c1");
            columns.Add("c2");
            columns.Add("c3");
            string text = CreateAllGroupingData(columns);
            WrieData(text);
        
        }
        private static void WrieData(string text)
        {
            string file = "ZuheTestout.js";
            StreamWriter sr = new StreamWriter(file);
            sr.WriteLine(text);
            sr.Close();
        }

第二种算法:

   private static string CreateAllSequenceData2(List<string> columns, List<string> columnsContain, string key)
        {
            StringBuilder strs = new StringBuilder();
            List<string> columnsContaininer = new List<string>();
            List<string> InnerColumns = GetInnerColumns(columns, columnsContain);
            bool hasAddParentcolumns = false;//是否已添加上层循环传入的元素
            for (int i = 0; i < InnerColumns.Count; i++)
            {
                string item = InnerColumns[i];
                if (!hasAddParentcolumns)
                {
                    columnsContaininer.AddRange(columnsContain);
                    hasAddParentcolumns = true;
                }                   
                    columnsContaininer.Add(item);
                    if (columnsContaininer.Count == columns.Count)//所有元素已添加,输出排列
                    {
                        string value = GetSequenceKey(columnsContaininer);
                        strs.AppendLine(key + ":" + value);
                        return strs.ToString();
                    }
                    else//还有元素没有添加,递归调用
                    {
                        strs.Append(CreateAllSequenceData2(columns, columnsContaininer, key));
                        columnsContaininer.Clear();//情况内部循环递归调用添加的元素
                        hasAddParentcolumns = false;    
                    }
                   
            }
            return strs.ToString();
        }
        private static List<string> GetInnerColumns(List<string> columnsAll, List<string> columnsContain)
        {
            List<string> InnerColumns = new List<string>();
            for (int i = 0; i < columnsAll.Count;i++ )
            {
                string item = columnsAll[i];
                if (!columnsContain.Contains(item)) {
                    InnerColumns.Add(item);
                }
            }
            return InnerColumns;
        }


排列数据的输出,布布扣,bubuko.com

排列数据的输出

标签:style   使用   os   数据   for   ar   代码   时间   

原文地址:http://blog.csdn.net/xuexiaodong009/article/details/38489247

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!