组合数据的输出

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

需求很简单,就是典型的组合应用。

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

由于输入数据的个数不确定,自然不能使用一般的循环,只能使用递归加循环。

经过不断的实验的和测试,发现有两种实现方法,

  1根据组合长度的输出,例如对于输入C0,C1,C2,C3,C4的五个元素,先输出,一个元素的所有组合,再输出两个元素的所有组合,一次类推,直到所有元素的组合都输出完成。

 具体实现代码:

 

  public static void CreatSumData2(List<string> columnNameList)
        {
            string res = "";
            // 一个元素
            for (int i = 0; i < columnNameList.Count; i++)//
            {
                string name = columnNameList[i];
                List<string> listContion = new List<string>();
                listContion.Add(name);
                res += OutPutData(listContion);
                listContion.Clear();
            }
            //两个以上元素
            int length = 2;
            int max = columnNameList.Count;//组合的最大元素个数
            while (length <= max)//一直循环到所有元素的组合,每一次循环,处理某一个长度的组合
            {
                for (int i = 0; i <= columnNameList.Count - length + 1; i++)//
                {
                    string name = columnNameList[i];
                    int currentlLvel = i + 1;
                    List<string> hasAddNameList = new List<string>();//保存已添加的元素
                    hasAddNameList.Add(name);
                    res += addOneContion(hasAddNameList, columnNameList, currentlLvel, length);
                    hasAddNameList.Clear();//清空元素
                }
                length++;
            }
            WrieData(res);
        }
        /// <summary>
        /// 添加一个元素
        /// </summary>
        /// <param name="hasAddNameList">已添加的元素</param>
        /// <param name="columnNameList">所有可能的元素</param>
        /// <param name="currentlLvel"></param>
        /// <param name="currentMaxLength">添加的元素的最大个数</param>
        /// <returns></returns>
        private static string addOneContion(List<string> hasAddNameList, List<string> columnNameList, int currentlLvel, int currentMaxLength)
        {
            string res = "";
            bool hasAddOutNames = false;
            int currentlLvelInner = currentlLvel;
            if (hasAddNameList.Count == currentMaxLength)
            {
                res += OutPutData(hasAddNameList);
                hasAddNameList.Clear();
                return res;
            }
            List<string> hasAddNameListInner = new List<string>();
            for (int i = currentlLvelInner; i < columnNameList.Count; i++)//
            {
                string colunmname = columnNameList[i];
                currentlLvelInner++;
                if (!hasAddOutNames)
                {
                    hasAddNameListInner.AddRange(hasAddNameList);
                    hasAddOutNames = true;
                }
                hasAddNameListInner.Add(colunmname);
                if (hasAddNameListInner.Count == currentMaxLength)
                {
                    res += OutPutData(hasAddNameListInner);
                    hasAddNameListInner.Clear();
                    hasAddOutNames = false;
                }
                else
                {
                    res += addOneContion(hasAddNameListInner, columnNameList, currentlLvelInner, currentMaxLength);
                    hasAddNameListInner.Clear();
                    hasAddOutNames = false;
                }
            }
            return res;
        }     

2 根据元素的输出,例如对于输入C0,C1,C2,C3,C4的五个元素,先输出包含C0这个元素的所有组合,再输出包含C1但不包含C0的所有组合,一次类推,直到所有元素的组合都输出完成。

具体实现代码

 public static void CreatSumData(List<string> columnNameList)
        {
            string res = "";
            List<string> hasAddNameList = new List<string>();
            for (int i = 0; i < columnNameList.Count; i++)//
            {
                string colunmname = columnNameList[i];
                int currentlLvel = i;
                currentlLvel++;
                hasAddNameList.Add(colunmname);
                res += OutPutData(hasAddNameList);
                res += CreatNextLevelData(hasAddNameList, columnNameList, currentlLvel);
                hasAddNameList.Clear();

            }
            WrieData(res);
        }
        private static string CreatNextLevelData(List<string> hasAddNameList, List<string> columnNameList, int currentlLvel)
        {
            string res = "";
            List<string> hasAddNameListInner = new List<string>();
            bool hasAddOutNames = false;

            int currentlLvelInner = currentlLvel;
            for (int i = currentlLvelInner; i < columnNameList.Count; i++)//
            {
                if (!hasAddOutNames) {
                    hasAddNameListInner.AddRange(hasAddNameList);
                }
                string colunmname = columnNameList[i];
                currentlLvelInner++;
                hasAddNameListInner.Add(colunmname);
                res += OutPutData(hasAddNameListInner);
                res += CreatNextLevelData(hasAddNameListInner, columnNameList, currentlLvelInner);
                hasAddOutNames = false;
                hasAddNameListInner.Clear();
            }
            return res;
        }

完整的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace WindowCeshi
{
    class ZuheTest
    {
        #region 根据组合长度的输出
        public static void CreatSumData2(List<string> columnNameList)
        {
            string res = "";
            // 一个元素
            for (int i = 0; i < columnNameList.Count; i++)//
            {
                string name = columnNameList[i];
                List<string> listContion = new List<string>();
                listContion.Add(name);
                res += OutPutData(listContion);
                listContion.Clear();
            }
            //两个以上元素
            int length = 2;
            int max = columnNameList.Count;//组合的最大元素个数
            while (length <= max)//一直循环到所有元素的组合,每一次循环,处理某一个长度的组合
            {
                for (int i = 0; i <= columnNameList.Count - length + 1; i++)//
                {
                    string name = columnNameList[i];
                    int currentlLvel = i + 1;
                    List<string> hasAddNameList = new List<string>();//保存已添加的元素
                    hasAddNameList.Add(name);
                    res += addOneContion(hasAddNameList, columnNameList, currentlLvel, length);
                    hasAddNameList.Clear();//清空元素
                }
                length++;
            }
            WrieData(res);
        }
        /// <summary>
        /// 添加一个元素
        /// </summary>
        /// <param name="hasAddNameList">已添加的元素</param>
        /// <param name="columnNameList">所有可能的元素</param>
        /// <param name="currentlLvel"></param>
        /// <param name="currentMaxLength">添加的元素的最大个数</param>
        /// <returns></returns>
        private static string addOneContion(List<string> hasAddNameList, List<string> columnNameList, int currentlLvel, int currentMaxLength)
        {
            string res = "";
            bool hasAddOutNames = false;
            int currentlLvelInner = currentlLvel;
            if (hasAddNameList.Count == currentMaxLength)
            {
                res += OutPutData(hasAddNameList);
                hasAddNameList.Clear();
                return res;
            }
            List<string> hasAddNameListInner = new List<string>();
            for (int i = currentlLvelInner; i < columnNameList.Count; i++)//
            {
                string colunmname = columnNameList[i];
                currentlLvelInner++;
                if (!hasAddOutNames)
                {
                    hasAddNameListInner.AddRange(hasAddNameList);
                    hasAddOutNames = true;
                }
                hasAddNameListInner.Add(colunmname);
                if (hasAddNameListInner.Count == currentMaxLength)
                {
                    res += OutPutData(hasAddNameListInner);
                    hasAddNameListInner.Clear();
                    hasAddOutNames = false;
                }
                else
                {
                    res += addOneContion(hasAddNameListInner, columnNameList, currentlLvelInner, currentMaxLength);
                    hasAddNameListInner.Clear();
                    hasAddOutNames = false;
                }
            }
            return res;
        }     

        #endregion
        #region 根据列输出
        public static void CreatSumData(List<string> columnNameList)
        {
            string res = "";
            List<string> hasAddNameList = new List<string>();
            for (int i = 0; i < columnNameList.Count; i++)//
            {
                string colunmname = columnNameList[i];
                int currentlLvel = i;
                currentlLvel++;
                hasAddNameList.Add(colunmname);
                res += OutPutData(hasAddNameList);
                res += CreatNextLevelData(hasAddNameList, columnNameList, currentlLvel);
                hasAddNameList.Clear();

            }
            WrieData(res);
        }
        private static string CreatNextLevelData(List<string> hasAddNameList, List<string> columnNameList, int currentlLvel)
        {
            string res = "";
            List<string> hasAddNameListInner = new List<string>();
            bool hasAddOutNames = false;

            int currentlLvelInner = currentlLvel;
            for (int i = currentlLvelInner; i < columnNameList.Count; i++)//
            {
                if (!hasAddOutNames) {
                    hasAddNameListInner.AddRange(hasAddNameList);
                }
                string colunmname = columnNameList[i];
                currentlLvelInner++;
                hasAddNameListInner.Add(colunmname);
                res += OutPutData(hasAddNameListInner);
                res += CreatNextLevelData(hasAddNameListInner, columnNameList, currentlLvelInner);
                hasAddOutNames = false;
                hasAddNameListInner.Clear();
            }
            return res;
        }
        #endregion
        private static string OutPutData(List<string> listold)
        {
            string text = "";
            for (int i = 0; i < listold.Count; i++)
            {
                string item = listold[i];
                text += "[\"" + item + "\"]";
            }
            return text + "\r\n";
        }
        private static void WrieData(string text)
        {
            string file = "ZuheTestout.js";
            StreamWriter sr = new StreamWriter(file);
            sr.WriteLine(text);
            sr.Close();
        }
    }
}

组合数据的输出

时间: 2024-08-29 16:34:31

组合数据的输出的相关文章

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

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

排列数据的输出

排列组合是高中是学到的 知识,理论上很清楚,但如何使用代码实现,却一直没有尝试过,近段时间由于项目需要,写一个排列的算法,想不到却花费了不少时间. 需求很简单,就是典型的排列应用. 例如输入:C0,C1,C2,C3,C4,输出C0,C1,C2,C3,C4的所有排列. 实现代码: /// <summary> /// 输出所有排列的数据 /// </summary> /// <param name="columns">输入的排列的所有元素</par

python的组合数据

python的组合数据包括:1.列表list[   ] 2.元组tuple(),3.字典dict{"x":"y"},4.集合set{} 1.创造组合数据:均可直接使用创造如:list1=[1,2,3,4]  tuple1(1,2,3,4) dict{"1":"2"."3":"4"}    对于list tuple和set可以互相转化 如:list1=[1,2,3,4]  set1=set

使用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

组合数据浅析之“幻方”

组合数据又称离散数学,个人理解,就相当于对一些数据的排序问题,随着计算机的日益发展,大数据问题就会凸显而出,这样就会需要组合数据的思维方式设计程序,从而使系统运行快速. 今天主要理解一下"幻方"问题,首先得要理解什么是幻方?其实就类似于"九宫格"的图形方式,从一到九填到格子中,然后每行每列,数字斜着相加结果相等,这样的一种图形运算方式就叫做幻方. 有一种运算方式可以快速搭建奇数的幻方形式. 通过((n+1)/2)*n的方式计算每行相加最终的值,n为方数,其中九宫格就

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,就给大家说一说在程序应用中,数据输出的方法,这里只是涉及一些简单的皮毛,比较简单,只是使用函数方法的

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

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