动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.JSF导航文件如何设置实例解析.
.深入解析Java的新特性assertion.
.JAVA教程 第五讲 AWT图.
.用JDO替代CMP的应用.
.Java 库的建立方法及其实例(1).
.直接召唤系与IoC fashion使.
.Java的魔力:字节码.
.osworkflow descriptor 解析片断.
.浅析Struts 体系结构与工作原理(.
.《Effective Java》学习笔记(2).
.如何使用Java网络启动部署软件.
.如何使用 Eclipse 功能部件来定制.
.用Jbuilder 7开发EJB例程--开发S.
.平行世界:Java和XML为何将成功.
.品味Spring的魅力.
.幸福的联姻:Java 和 Python.
.Java技术与XML常见问题之一般问题.
.Java对Domino Objects的访问 (2.
.编写高级应用程序1.
.J2EE应用系统内部的Web Services.

一个实现排列和组合的JavaBean

发表日期:2008-1-5 |



  在我们编程时,经常要涉及到排列和组合的问题。那么在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+\"<BR>\";
  }
  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+\"<BR>\";
  }
  return selectsomechar;
  }
  public void addSelect(String[][] selectchar,int[][] selectint,int z,int position,int select)
  //增加新的组合
  {int i;
  if (position==select)
  {if (selectint[z][position]<charcount)
  {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]<charcount-select+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:
  <%@ page contentType=\"text/Html;charset=gb2312\" %>
  <HTML>
  <HEAD>
  <TITLE>
  排列和组合
  </TITLE>
  </HEAD>
  <BODY>
  <jsp:useBean id=\"mytest\" scope=\"page\" class=\"customers.mytest\" />
  <%
  mytest.SetMyTest();
  mytest.insertChar(\"YSY\");
  mytest.insertChar(\"DBF\");
  mytest.insertChar(\"CYY\");
  mytest.insertChar(\"YKF\");
  mytest.insertChar(\"SJJ\");
  mytest.insertChar(\"YZDS\");
  out.print(mytest.listAllChar());
  out.print(mytest.selectSomeChar(3));
  %>
  </BODY>
  </HTML>
  
  三、排列
  所谓排列,就是从n个对象中取出m个对象的所有排列的可能。

上一篇:关于继承和接口的一个非常有趣的比喻 人气:325
下一篇:Rational为由设计直接生成代码努力 人气:268
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-6 飞天论坛FTBBS ASP v6.3 Build 0
2008-7-6 飞天论坛FTBBS ASP v6.3 Build 0
2008-7-6 飞天论坛FTBBS ASP v6.8 Build 0
2008-7-6 讯息内容管理系统 v2.1
2008-7-6 三五电影程序 v2.0
2008-7-6 神鹰腾讯小说小偷 v3.0
2008-7-6 EasyIDE Framework v1.0 Build 2
2008-7-6 品告CMS系统(电影版) v0.9
2008-7-6 QQ自动登录器 C# 源码 v1.0
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報