排列数据的输出

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

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

例如输入: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;
        }

排列数据的输出

时间: 2024-08-06 11:27:20

排列数据的输出的相关文章

排列数据的输出(二) 循环处理

排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个排列的算法,想不到却花费了不少时间. 在排列数据的输出一文中列举了几种输出的方法,但都是递归的方法,但又没有不用递归,只用循环的方法呢?于是自己就开始考虑了,都知道 要把4个元素的所有排列输出,必须递归4次,对应的是4层的循环,要把5个元素的所有组合输出,必须递归5次,对应的是5层的循环,一时间自己竟没有找到如何把递归改为循环的方法.于是自己就一最简单的方法,思考一个元素的排列,两个元素

组合数据的输出

排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个组合的算法,想不到却花费了不少时间. 需求很简单,就是典型的组合应用. 例如输入:C0,C1,C2,C3,C4,输出C0,C1,C2,C3,C4的所有组合. 由于输入数据的个数不确定,自然不能使用一般的循环,只能使用递归加循环. 经过不断的实验的和测试,发现有两种实现方法,   1根据组合长度的输出,例如对于输入C0,C1,C2,C3,C4的五个元素,先输出,一个元素的所有组合,再输出两

使用python获取webservice数据并输出到文件

上头要求设置TCP备案检查,给了个WEBSERVICE接口.查了2天,才确认还是python比较好用,我这水平也就写个脚本把数据导出,过滤检索还是用的shell.写此文备忘.WEBSERVICE接口脚本如下: #! /usr/bin/python #coding:utf-8 import codecs import suds def main(file_name, out_file): url = 'http://121.14.4.210:8088/icpautobj/ws/getIcp?wsd

向文件输出数据的输出字节流

1 package com.outputstream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.util.Arrays; 1

php中json对象数据的输出转化

php中json对象数据的输出转化 public function get_my_now_citys(){ $datas=$this->_post('datas'); //前台js脚本传递给后端的object对象 if(!$datas){ echo '地址信息获取失败!'; } $latitude=$datas['latitude'];//维度 $longitude=$datas['longitude'];//经度 $rs=$this->get_my_addr_infos($longitude

STL学习篇:数据的输出

我们都知道计算机由5个部分组成:控制器(Control).运算器(Datapath). 存储器(Memory).输入(Input system) 输出(Output system).不管是什么时候,我们都是得到相应的数据,然后输入到处理设备进行相应处理,然后输出,这其中不能缺少任何一个环节!所有现在人们提高计算机的处理速度是很重要的,那么数据的输入.输出操作也是非常重要的!这两天一直在学习STL,就给大家说一说在程序应用中,数据输出的方法,这里只是涉及一些简单的皮毛,比较简单,只是使用函数方法的

第二章:oracle_sql语句之限制(where子句)和排列数据(order by子句)

限制数据访问: 使用数字做条件 select ename,sal,deptno from emp where DEPTNO=10; 使用字符做条件,字符串要单引,大小写敏感! select ename,sal,deptno from emp where ename='king'; select ename,sal,deptno from emp where ename='KING'; 使用日期做条件,格式敏感! select ename,hiredate from emp where hired

板邓:wordpress 自定义数据表输出实现分页功能

wordpress文章列表也实现分页很简单,网上有很多代码直接复制过来用就可以实现,但是如果是列表页输出的是我们新建的数据表内容,这个就不能实现了!需要自己开发才行. php+mysql 结合wordpress的一些方法实现! 代码如下: $page=$_GET['page'];//当前是第几页 $pagesize=10;//每页显示记录数量 $pages=($page-1)*$pagesize;//偏移量 $nums=$num/$pagesize;//总页数 if(!$_GET['page']

删除重复数据 且输出数据与输入数据一致

如果是不要求输出顺序与输入顺序一致,则直接用set就可以筛掉重复的数据,但set会将数据从小到大排序 因此只能用循环的办法,从i开始,i+1循环 循环到与a[i]相同时,将后面的每个数都依次向前移一位 移完之后不要忘记把总数减一,并且下一次要循环的数应该为刚刚的位置,也要减一 #include <iostream> using namespace std; int main(){ int a[500],i,j,k,c; while(cin>>a[0]){ for(i=1;i<