一个实现排列和组合的JavaBean

原创 2004年07月08日 11:27:00
一个实现排列和组合的JavaBean

2002年08月07日 20:28:38 LinuxAid

    在我们编程时,经常要涉及到排列和组合的问题。那么在Java中应该如何实现呢?其实这个问题首先是个算法的问题,明确了算法,用什么编程语言倒是显得不那么重要了。
一、全排列
    所谓全排列,就是对n个对象,列出其所有可能的排列顺序。这个问题相对来说要简单一点。让我们先从最简单的情况着手,如果我们只有一个对象,该如何实现其全排列呢?答案很简单,现在我们只有一种排列。OK,现着我们试着引入第二个对象,首先我们需要知道,现在增加了几种全排列的可能,我们可以这么看,第n个对象的引入,对于n-1个对象的全排列的影响就是在原先的每一个全排列中的任一位置插入第n个对象,也就是说,listcount(n)=listcount(n-1)*n;而按照这个思路,对于任意n个对象的全排列,我们都可以从最简单的一个对象的全排列开始直到生成全部n个对象的全排列。
二、组合
    所谓组合,就是从n个对象中取出任意m个对象的全部可能。这个问题可能要复杂一点。对于组合来说,对象的顺序是没有意义的,1、2、3和3、2、1是同一种可能。那么我们有必要人为地制定一个规则,我们可以设想给每一个对象编上连续的序号,而在我们的组合中对象必须是按其序号的顺序排列,这样我们就能有效地避免排列顺序对我们的影响。假定我们现在有六个对象,其序号是1、2、3、4、5、6。那么我们的第一种组合是1、2、3,而最后一种组合则是4、5、6。在此之间,我们经历了其它有可能出现的18种情况,对于这种算法我们很自然地会想到使用递归函数。首先我们先在我们的结果集中定义第一种可能是1、2、3,然后我们把当前位置定为最后一位,只要有可能,对于最后一位来说,它的最大值只能是6,在未到6之前,每增加一次就增加一种新的组合,如果最后一位已经是6,则我们将当前位置转入前一位,前一位的最大值是5,如果前一位还没到5,则将前一位加一,然后当前位置再度转入最后一位,现在最后一位的最小值是4,从4开始直到6,又形成了我们新的组合,这样,直到我们最终出现4、5、6这个组合时,函数退出。
下面是我们的Java源程序:
mytest.java:
package customers;
public class mytest
{String[] mychar=new String[50];
int charcount;
int charlist;
public void SetMyTest()
//初始化
{charcount=0;
charlist=1;
}
public void insertChar(String thischar)
//增加新的字符串
{charcount++;
mychar[charcount]=thischar;
charlist*=charcount;
}
public String listAllChar()
//列出全排列
{String[][] allchar=new String[charlist+1][charcount+1];
int i;
int j;
int z=1;
for (i=1;i<=charcount;i++)
{myCopy(addCharList(i,allchar,z),allchar,charlist,charcount);
z*=i;
}
String listallchar=new String("");
for (i=1;i<=charlist;i++)
{for (j=1;j<=charcount;j++)
listallchar+=allchar[i][j]+" ";
listallchar=listallchar+"
";
}
return listallchar;
}
public String[][] addCharList(int i,String[][] allchar,int z)
//在i-1个对象的全排列中引入第i个对象
{int j;
int h=1;
int k;
String[][] tempallchar=new String[charlist+1][charcount+1];
for (k=1;k<=z;k++)
{for (j=1;j<=i;j++)
{myCopy(tempchar(j,allchar[k],mychar[i]),tempallchar[h],charcount);
h++;
}
}
return tempallchar;
}
public String[] tempchar(int i,String[] beginchar,String thischar)
//将新对象插入指定位置
{int j;
String[] tempbeginchar=new String[charcount+1];
myCopy(beginchar,tempbeginchar,charcount);
for (j=charcount;j>i;j--) tempbeginchar[j]=tempbeginchar[j-1];
tempbeginchar[i]=thischar;
return tempbeginchar;
}
public String selectSomeChar(int select)
//列出其中取出select个对象的全部组合
{int selectcount=1;
int i;
for (i=select+1;i<=charcount;i++) selectcount=selectcount*i/(i-select);
String[][] selectchar=new String[selectcount+1][select+1];
int[][] selectint=new int[selectcount+1][select+1];
for (i=1;i<=select;i++)
{selectchar[1][i]=mychar[i];
selectint[1][i]=i;
}
int z=1;
addSelect(selectchar,selectint,1,select,select);
int j;
String selectsomechar=new String("");
for (i=1;i<=selectcount;i++)
{for (j=1;j<=select;j++)
selectsomechar+=selectchar[i][j]+" ";
selectsomechar=selectsomechar+"
";
}
return selectsomechar;
}
public void addSelect(String[][] selectchar,int[][] selectint,int z,int position,int select)
//增加新的组合
{int i;
if (position==select)
{if (selectint[z][position] {z++;
myCopy(selectint[z-1],selectint[z],select);
selectint[z][select]++;
for (i=1;i<=select;i++) selectchar[z][i]=mychar[selectint[z][i]];
addSelect(selectchar,selectint,z,position,select);
}
else
{position--;
addSelect(selectchar,selectint,z,position,select);
}
}
else
{if (selectint[z][position] {selectint[z][position]++;
selectint[z][position+1]=selectint[z][position]+1;
position++;
addSelect(selectchar,selectint,z,position,select);
}
else
{if (position==1)
{return;
}
else
{position--;
addSelect(selectchar,selectint,z,position,select);
}
}
}
}
public void myCopy(String[][] Str1,String[][] Str2,int i,int j)
{int h;
int k;
for (h=1;h<=i;h++) for (k=1;k<=j;k++) Str2[h][k]=Str1[h][k];
}
public void myCopy(String[] Str1,String[] Str2,int i)
{int h;
for (h=1;h<=i;h++) Str2[h]=Str1[h];
}
public void myCopy(int[] Str1,int[] Str2,int i)
{int h;
for (h=1;h<=i;h++) Str2[h]=Str1[h];
}
}
现在我们可以在一个JSP程序中使用这个JavaBean:


三、排列
所谓排列,就是从n个对象中取出m个对象的所有排列的可能。事实上,我们先生成这样的组合,然后对每一个组合进行全排列就可以了,有兴趣的读者可以自己试着实现这种功能。
(作者:处处)

版权声明:本文为博主原创文章,未经博主允许不得转载。

面试题:对1、2、2、3、4、5六个数字进行排列组合

Sorry,到现在还没完全进入写代码的状态,头晕晕的。。。上午看到一同学发了一道排列组合的编程笔试题,感觉挺有意思的,反正都没进入状态,就先试下,看能否解决,并进入状态。题目:用1、2、2、3、4、5...
  • a10615
  • a10615
  • 2016年04月11日 18:52
  • 4042

字符串全排列与全组合的递归实现-Java版

排列组合算法用途广泛, 需要掌握, 为降低门槛, 本文主要关注算法的逻辑和简易性, 未重视算法效率. 结合网络书本上的实现和自己的需求, 这里列有四个目标: 1. 所有元素的全排列: ab的全排列是...
  • kslinabc
  • kslinabc
  • 2015年05月10日 22:42
  • 6020

全排列、全组合 java实现

全排列所谓全排列就是根据输入字符打印出所有字符的排列方式(分次序)。例如输入abc,所有排序的结果有,abc,cba,bac,cab,acb,bca 共6种情况。对于全排列,如果用循环的方法,需要O(...
  • joson793847469
  • joson793847469
  • 2016年10月06日 14:34
  • 2067

用java写一个main函数实现排列组合

1. 用1、2、3、4、5这五个数字,用java写一个main函数,打印出所有不同的排列,如:51234、41235等。  Java代码   public class ...
  • dong281055686xin
  • dong281055686xin
  • 2015年09月25日 14:14
  • 270

实现一个字符串的所有排列组合

/* * 求一个字符串所有的排列组合,字符串可以有重复的字符, * *(注意如果字符串中间有数组的话是没有进行清除的) */ /* * 思路: * 1.检查字符串是否规范,检查字符串长度...
  • qq_24188311
  • qq_24188311
  • 2017年04月21日 00:04
  • 368

在oracle上实现的单表的分页框架,使用该框架只需要新建一个显示的jsp,更改数据库连接,创建对应的javaBean就可以使用,详情请下载后查看分页框架说明

  • 2014年08月24日 16:06
  • 1.11MB
  • 下载

JSP+JavaBean实现一个销售额的查询

  • 2013年07月19日 18:55
  • 667KB
  • 下载

jsp+javaBean+servlet+mysql完整的实现一个登录功能

  • 2017年07月31日 17:25
  • 2.71MB
  • 下载

使用jsp javabean 和jdbc实现一个个人信息提交页面

实现这个页面用到三个部分:用户提交页面 显示结果页面(成功或者失败) 数据操作类 用户提交页面     pageEncoding="UTF-8"%> 学生信息提交 学号 姓名 性别 ...
  • qq_39394276
  • qq_39394276
  • 2017年12月21日 22:03
  • 37

jsp+javaBean+servlet+mysql完整的实现一个登录功能

以前对于这种功能就只是复制粘贴,并没有真正的深入了解过,现在就来深入的一步一步的实现功能; 1.在eclipse中新建一个动态的web工程; 2.在webContent目录下创建一个jsp页面,命...
  • csdn_zsdf
  • csdn_zsdf
  • 2017年07月31日 17:27
  • 590
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个实现排列和组合的JavaBean
举报原因:
原因补充:

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