专注于Jsp开发,为Jsp开发提供源动力 VM主机| 海外空间| 郑州网站建设| 郑州网络公司| 洛阳网站建设
jsp空间

Java实现通用组合算法

添加时间:[2010-9-8 18:16:47] 

 现在有这样的需求:

  存在一个类似{31311133,33113330}这样的集合,经过8取5组合,其他位置用非字母数字字符替代,比如使用*号,得到类似{3***1133,***13330,......}这样的集合;

  还要求对于{3***1133,***13330}这样的集合,再次经过5取3组合,其他位置用非字母数字字符替代,比如使用*号,得到类似{*****133,*****330,3***1*3*,......}这样的集合。

  对于这样的要求,实现的思路如下:

  首先,主要思想是基于信息编码原理,通过扫描字符串,将10组合变为01组合。

  其次,对于每个数字字符串,设置一个单线程,在单线程类中设置一个List用来存放待处理数字字符串(可能含有*号,或者不含有)中每个数字的(而非*号)索引位置值;

  再次,设置BitSet来标志每个位置是否被*号替换得到新的组合字符串。

  最后,在扫描原始待处理数字字符串的过程中,根据设置的字符列表List中索引,来操作BitSet,对于每一个BitSet得到一个新的组合。

  使用Java语言实现如下:

  packageorg.shirdrn;

  importjava.util.ArrayList;

  importjava.util.BitSet;

  importjava.util.Collection;

  importjava.util.Collections;

  importjava.util.HashSet;

  importjava.util.Iterator;

  importjava.util.List;

  /**

  *通用组合拆分类(基于单线程)

  *

  *可以完成两种功能:

  *

  *第一,可以将完全数字串拆分成为含有*号的字符串。<br>

  *例如:输入集合{31311133,33113330},Splitter类会遍历该集合,对每个字符串,创建一个SplitterThread<br>

  *线程来处理,如果是2取1组合,即starCount=8-2=6,经过线程处理得到类似******33,*****1*3等结果

  *

  *第二,根据从带有*号的字符串经过拆分过滤后得到的字符串集合,对其中每一个字符串进行组合<br>

  *例如:输入集合5取1组合字符串集合{3***1133,***113330}<br>

  *

  *CommonSplitter类会遍历该集合,对每个带有*号的字符串,创建一个SplitterThread<br>

  *线程来处理,如果是2串1组合,即starCount=8-3-2=3,经过线程处理得到类似******33,*****1*3等结果

  *

  *@author时延军

  *

  */

  publicclassCommonSplitter{

  privateintstarCount;

  privatebooleanduplicate;

  privateCollection<String>filteredContainer;

  publicCollection<String>getFilteredContainer(){

  returnfilteredContainer;

  }

  /**

  *构造一个Spilitter实例

  *

  *@paramcontainer输入的待处理字符串集合

  *@paramstarCount如果对于长度为N的数字字符串,进行M组合(即N取M),则starCount=N-M

  *@paramduplicate是否去重

  */

  publicCommonSplitter(Collection<String>container,intstarCount,booleanduplicate){

  this.duplicate=duplicate;

  this.starCount=starCount;

  if(this.duplicate){//根据指定是否去重的选择,选择创建容器

  filteredContainer=Collections.synchronizedSet(newHashSet<String>());

  }

  else{

  filteredContainer=Collections.synchronizedList(newArrayList<String>());

  }

  Iterator<String>it=container.iterator();

  while(it.hasNext()){

  newThread(newSplitterThread(it.next().trim())).start();

  }

  try{

  Thread.sleep(50);

  }catch(InterruptedExceptione){

  e.printStackTrace();

  }

  }

关于我们 | 付款方式 | 客户管理 | 网站导航 | 友情连接


版权所有 2008 三易网络(洛阳)科技开发有限公司 京ICP备06012028号

服务热线:0371-63653120 63658758(郑州) 0379-63921200   63265368(洛阳)

QQ在线客服: JSP空间咨询   JSP空间咨询    Email:web@suneasy.cn

郑州网络公司 郑州网站建设 洛阳网站建设

总部地址:纱厂南路41号中泰新城泰福苑803室 郑州分公司地址:金水区圣菲城