枚举数组中所有可能排列的代码实现 [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

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

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 16:11
  • 163

2004年7月19日 我终于见到明星了

昨天晚上10点,我去给小莉送了杀毒盘,可惜只说了几句话她就回去了,没劲,累死我了! 今天上午,黄晓明来了,哈哈哈哈,好歹也是个明星,   公司的小姑娘都快疯了,不过的确很帅,我还照了好几张照片,忙活了...
  • iazxq
  • iazxq
  • 2004年07月19日 16:07
  • 426

2004年7月8日

专栏- 12533 文章- 27682 收藏- 1079 评论- 5522 Track- 114
  • grhunter
  • grhunter
  • 2004年07月08日 12:07
  • 1231

简单枚举题,0到9全排列

输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,n为2到79 样例输入:62 样例输出:79546/01283=62     ...
  • qwerty_xk
  • qwerty_xk
  • 2012年08月15日 17:19
  • 2626

枚举类Enumeration的使用

Enumeration Enumeration接口本身不是一个数据结构。但是,对其他数据结构非常重要。  Enumeration接口定义了从一个数据结构得到连续数据的手段。 例如,Enu...
  • wangbaoyin
  • wangbaoyin
  • 2012年05月12日 23:11
  • 2643

给定一个字符串,输出其所有的可能排列

转载请注明来自souldak,微博:@evagle Question: 给你一个字符串例如abb输出它包含的字符的所有可能排列。 例如abb输出3个:abb,bab,bba Answer: 假设我们自...
  • huangbingliang
  • huangbingliang
  • 2013年09月10日 17:10
  • 1856

使用递归的方法生成一个序列的所有排列

#include using namespace std; int a[100]; int count; void swap(int A[],int i,int j) { int temp...
  • zhuyongqingacm
  • zhuyongqingacm
  • 2015年03月01日 11:13
  • 466

获得一个数组的全排列

例如 char a[]="abcd" 求这个数组的全排列,将复杂问题或者不能直接解决的问题转变为多个简单问题的方法就是,让所有的元素一次成为第一个元素, void Traversal(char* ...
  • dasgk
  • dasgk
  • 2015年07月21日 21:15
  • 980

2017年7月-学习笔记

本学习笔记主要记录了我对tcp/ip卷1这本书的学习心得,主要看的电子版的数目,本文中图片如无特别说明,均来自,[张防涛-简书]当中tcp/ip详解的文章。作者:张芳涛 链接:http://www....
  • Kang_TJU
  • Kang_TJU
  • 2017年07月17日 10:29
  • 533

JAVA里实现一个数组全排列的方法

 import java.util.Arrays;/** * 获得数组全排列的一个实现算法 * * @author 老紫竹的家(laozizhu.com) * */public class Tes...
  • java2000_net
  • java2000_net
  • 2009年03月08日 08:47
  • 9436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:枚举数组中所有可能排列的代码实现 [2004年7月8日 1:57 ]
举报原因:
原因补充:

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