枚举数组中所有可能排列的代码实现 [2004年7月8日 1:57 ]

原创 2004年07月11日 04:06:00

在做数据查询的模块,想一个常常会遇到的问题,就是查询的时候经常适应各种排序的要求,一般的做法是,放上一个控件,比如ComboBox,然后上面写上

按照时间排序

按照名称排序

........................

这样要是有多个字段同时排序(eg. order by uname, tdate)的时候,要考虑多次,放的控件也要多个,代码更是累赘,怎么样才能一次代码就能适合各种场合的使用呢?这就用到在这里说到的:

             枚举数组中所有可能的排列。

这和上面说到的有什么关系呢?思路是这样:

1。定义个数组:里面是所有需要排序字段名称的集合

eg.  {“serialno“,“ratedate“,“cycode“}

2。枚举这个数组,这就意味着这个数组构成了一个树,不是吗?且来看看:

ROOT
   |--serialno
   |      |--ratedate
   |      |     |--cycode          //serialno,ratedate,cycode
   |      |
   |      |--cycode
   |            |--ratedate        //serialno,cycode,ratedate
   |--ratedate
   |      |--cycode
   |      |     |--serialno        //ratedate,cycode,serialno
   |      |
   |      |--serialno
   |            |--cycode        //ratedate,serialno,cycode
   |--cycode
          |--serialno
          |     |--ratedate      //cycode,serialno,ratedate
          |
          |--ratedate
                |--serialno       //cycode,ratedate,serialno

这样只要点击其中一个节点,一直GetParent上去,就一定能找到一个独一无二的路径,并且不会有节点重复(也就是字段拉)。

3。真正使用的时候,考虑为了不占窗体空间,可以使用快捷菜单,按照上面的树布置菜单节点,这样有个缺点,就是不能只选择其中一段作为排序路径,比如必须这样order by cycode,ratedate,serialno ,而不能order by cycode,ratedate 。因为是菜单阿!只有到了叶子才能点击。奢侈一点,就可以直接用TreeCtrl了,这样每个节点都有点击事件,也就是说,可以选取其中部分排序了。

下面代码使用TreeCtrl做。

#define ITEM_COUNT 5
const char item[ITEM_COUNT][20]={"AA","BB","CC","DD","EE"};

//strPath 从根节点到父节点的路径信息,index 当前应插入的节点索引
bool IsInPath(CString strPath,int index)
{//这个函数判断要插入的节点是否已经在路径中
 TRACE("%s_____%s/n",strPath.GetBuffer(0),&item2[index]);
        strPath.ReleaseBuffer();
 int n = strPath.Find((char*)&item2[index]);
 if(strPath.Find((char*)&item2[index])>=0)
  return true;
 else
  return false;
}
void TestInserItem(CTreeCtrl* treeCtrl,HTREEITEM hParent,int from,int count,CString strPath)
{//hParent父节点 ,from 在数组中的起始索引, count 插入个数(进入下一级个数-1)
 //strPath路径
 from=from%ITEM_COUNT;
 int j=from;

 for(int i=from;i<count+from;i++,j++)
 {
  if(j>=ITEM_COUNT)
   j=0;
  while(IsInPath(strPath,j))
  {//注意不要越界
   j++;
   j=j%ITEM_COUNT;
  }
  HTREEITEM hCurr;
  TVINSERTSTRUCT tvInsert;
  tvInsert.hParent = hParent;
  tvInsert.hInsertAfter = NULL;
  tvInsert.item.mask = TVIF_TEXT;
  tvInsert.item.pszText = (char*)&item[j];
  hCurr = treeCtrl->InsertItem(&tvInsert);
  TestInserItem(treeCtrl,hCurr,i+1,count-1,strPath+(char*)&item[j]);
 }
}
 str = "ROOT";
 tvInsert.hParent = NULL;
 tvInsert.hInsertAfter = NULL;
 tvInsert.item.mask = TVIF_TEXT;
 tvInsert.item.pszText = (LPSTR)str.GetBuffer(0);
 str.ReleaseBuffer();               //插入父节点
 HTREEITEM hRoot = treeCtrl.InsertItem(&tvInsert);
 TestInserItem(&treeCtrl,hRoot,0,ITEM_COUNT,"");

这里还有类似的实现代码
http://community.csdn.net/Expert/topic/3157/3157589.xml?temp=.6269342

【C语言】【枚举所有可能】

题目: A,B,C,D,E,F,G,H,I,J,共10名学生有可能参加计算机竞赛,也可能不参加, 因为某种原因他们受到下列条件的约束:  1. 如果A参加,B也参加;  2. 如果C不参加,D...
  • a781558066
  • a781558066
  • 2014年12月21日 17:12
  • 421

1,2,3,4,5全排列--使用循环(多层循环)--枚举法

/* 题目标题: 1、2、3、4、5形成的全排列 方法---枚举法 12345形成的全排列组成的肯定是一个5位数 分别用n1,n2,n3,n4,n5 表示全排列的位置1,2,3,4,5的数字 ...
  • smallgyy
  • smallgyy
  • 2013年05月17日 07:56
  • 1247

暴力求解法中的枚举排列,生成全排列

**对于一个长度为n数组长度的数组={0,1,2,3,..., n-1}。要想枚举它的所有的长度为n的全排列出来。** 有两种选择:一个是直接枚举, 另外一个是使用递归构造。...
  • qq_37919136
  • qq_37919136
  • 2017年04月15日 19:41
  • 441

算法--生成1~n的排列

在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为: (1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(...
  • hhhzua
  • hhhzua
  • 2015年04月05日 19:54
  • 663

Java第七章数组与枚举实验一(遍历与复制数组)

实验目的: 掌握Arrays调用static方法操作数组 代码: import java.util.Arrays; public class Test { public static void...
  • qq_34216631
  • qq_34216631
  • 2016年10月18日 11:26
  • 657

15.Permutations-全排列(中等题)

全排列 题目给定一个数字列表,返回其所有可能的排列。注意事项 你可以假设没有重复数字。 样例给出一个列表[1,2,3],其全排列为: 挑战使用递归和非递归分别解决。 题解 1.递归解法 首先固定...
  • Tri_Color_Flag
  • Tri_Color_Flag
  • 2016年09月21日 00:55
  • 397

算法竞赛入门第七章(2):枚举排列和子集

可重复集的排列:可重复集的排列:有几点要注意(a):(a):首先对序列进行排序,然后枚举时候要跳过相同的元素。(b):(b):由于存在相同的元素,因此枚举时要判断是否该元素已经全部用完了。(c):(c...
  • pp634077956
  • pp634077956
  • 2016年08月14日 20:53
  • 303

C语言定义数组时使用枚举作为数组的下标

昨天写代码被人告知还有这种写法,很神奇。通常情况下定义数组都是顶一个什么类型的数组然后下标或者脚标就是从0开始++++int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, ...
  • wq3028
  • wq3028
  • 2017年07月27日 16:07
  • 544

数组枚举部分

数组 1.创建数组 声明数组: int  a[]; 创建数组: a = new a[5]; 声明与创建同时: int a[] = new a[5]; length:使用a.length来获得数组长度,...
  • sinat_37443796
  • sinat_37443796
  • 2017年02月10日 20:37
  • 231

PHP的100个知识点--1枚举数组

foreach的使用: 1.用法1   $arr=array("张三","李四","王五","马六");   foreach($arr as $value)   echo $va...
  • jimlong
  • jimlong
  • 2013年02月19日 18:08
  • 1319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:枚举数组中所有可能排列的代码实现 [2004年7月8日 1:57 ]
举报原因:
原因补充:

(最多只允许输入30个字)