ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:17.12KB ,
资源ID:12013592      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12013592.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java编程实现通用组合算法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java编程实现通用组合算法.docx

1、Java编程实现通用组合算法Java编程实现通用组合算法Java实现通用组合算法,存在一个类似31311133,33113330这样的集合,经过8取5组合,其他位置用非字母数字字符替代,比如使用*号,得到类似3*1133,*13330,. .这样的集合;现在有这样的需求:存在一个类似31311133,33113330这样的集合,经过8取5组合,其他位置用非字母数字字符替代,比如使用*号,得到类似3*1133,*13330,. .这样的集合;还要求对于3*1133,*13330这样的集合,再次经过5取3组合,其他位置用非字母数字字符替代,比如使用*号,得到类似*133,*330,3*1*3*,.

2、 .这样的集合。对于这样的要求,实现的思路如下:首先,主要思想是基于信息编码原理,通过扫描字符串,将10组合变为01组合。其次,对于每个数字字符串,设置一个单线程,在单线程类中设置一个List用来存放待处理数字字符串(可能含有*号,或者不含有)中每个数字的(而非*号)索引位置值;再次,设置BitSet来标志每个位置是否被*号替换得到新的组合字符串。最后,在扫描原始待处理数字字符串的过程中,根据设置的字符列表List中索引,来操作BitSet,对于每一个BitSet得到一个新的组合。使用Java语言实现如下:package org.shirdrn;import java.util.ArrayLi

3、st;import java.util.BitSet;import java.util.Collection;import java.util.Collections;import java.util.HashSet;import java.util.Iterator;import java.util.List;/* 通用组合拆分类(基于单线程)* 可以完成两种功能:* 第一,可以将完全数字串拆分成为含有*号的字符串。* 例如:输入集合31311133,33113330,Splitter类会遍历该集合,对每个字符串,创建一个SplitterThread* 线程来处理,如果是2取1组合,即sta

4、rCount=8-2=6,经过线程处理得到类似*33,*1*3等结果* 第二,根据从带有*号的字符串经过拆分过滤后得到的字符串集合,对其中每一个字符串进行组合* 例如:输入集合5取1组合字符串集合3*1133,*113330* CommonSplitter类会遍历该集合,对每个带有*号的字符串,创建一个SplitterThread* 线程来处理,如果是2串1组合,即starCount=8-3-2=3,经过线程处理得到类似*33,*1*3等结果* author 时延军*/public class CommonSplitter private int starCount;private boole

5、an duplicate;private Collection filteredContainer;public Collection getFilteredContainer() return filteredContainer;/* 构造一个Spilitter实例* param container 输入的待处理字符串集合* param starCount 如果对于长度为N的数字字符串,进行M组合(即N取M),则starCount=N-M* param duplicate 是否去重*/public CommonSplitter(Collection container, int starCo

6、unt, boolean duplicate) this.duplicate = duplicate;this.starCount = starCount;if(this.duplicate) / 根据指定是否去重的选择,选择创建容器filteredContainer = Collections.synchronizedSet(new HashSet();else filteredContainer = Collections.synchronizedList(new ArrayList();Iterator it = container.iterator();while(it.hasNext

7、() new Thread(new SplitterThread(it.next().trim().start();try Thread.sleep(50); catch (InterruptedException e) e.printStackTrace();/* 对一个指定的N场比赛的长度为N的单式投注字符串进行组合* 输入单式投注注字符串string,例如31311133,组合得到类似*33,*1*3,. .结果的集合* author 时延军*/class SplitterThread implements Runnable private char charArray;private

8、int len; / 数字字符的个数List occupyIndexList = new ArrayList(); / 统计字符串中没有带*的位置的索引private List container = new ArrayList();private BitSet startBitSet; / 比特集合起始状态private BitSet endBitSet; / 比特集合终止状态,用来控制循环public SplitterThread(String string) this.charArray = string.toCharArray();this.len = string.replace(*

9、, ).length();this.startBitSet = new BitSet(len);this.endBitSet = new BitSet(len);/ 初始化startBitSet,左侧占满*符号int count = 0; /for (int i=0; iif(charArrayi != *) if(count 0; i-) if(charArrayi != *) if(count 1 & count0) pos-;endIndex = this.occupyIndexList.get(pos);for (int i=0; ithis.startBitSet.set(start

10、Index, true);this.startBitSet.set(endIndex, false);startIndex = this.occupyIndexList.get(i+1);pos-;if(pos0) endIndex = this.occupyIndexList.get(pos);/ 将遇到1的位置用*替换for (int i=0; iif (this.startBitSet.get(this.occupyIndexList.get(i) charArrayClonethis.occupyIndexList.get(i) = *;this.container.add(new S

11、tring(charArrayClone);测试用例如下所示:package org.shirdrn;import java.util.ArrayList;import java.util.Collection;import junit.framework.TestCase;import org.shirdrn.util.GoodTools;public class TestCommonSplitter extends TestCase private CommonSplitter splitter;public void setSplitter(Collection container, i

12、nt starCount, boolean duplicate) this.splitter = new CommonSplitter(container, starCount, duplicate);public void testSplliter() Collection container = new ArrayList();container.add(1*10*);int starCount = 2;boolean duplicate = true;this.setSplitter(container, starCount, duplicate);System.out.println(

13、this.splitter.getFilteredContainer();public void testSplliter3() Collection container = new ArrayList();container.add(1*10*1300*);int starCount = 3;boolean duplicate = true;this.setSplitter(container, starCount, duplicate);System.out.println(this.splitter.getFilteredContainer();assertEquals(35, this

14、.splitter.getFilteredContainer().size();public void testNoStar() Collection container = new ArrayList();container.add(3110330);int starCount = 3;boolean duplicate = true;this.setSplitter(container, starCount, duplicate);System.out.println(this.splitter.getFilteredContainer();assertEquals(35, this.sp

15、litter.getFilteredContainer().size();public void testSplitter_8_310() / 8 场:310String multiSeq = 310,310,310,310,310,310,310,310;Collection container = GoodTools.getNSingleList(multiSeq);assertEquals(6561, container.size();int starCount = 4;boolean duplicate = false;this.setSplitter(container, starCount, duplicate);assertEquals(459270, this.splitter.getFilteredContainer().size();上述测试耗时大约2s左右。上述算法实现主要是针对两种条件进行实现的,即:第一个是完全数字字符串 带有*号的组合数字字符串;第二个带有*号的组合数字字符串 在该基础上继续组合得到带有*号的组合数字字符串。如果使用上述算法实现处理第一个条件,由于使用了列表List来记录索引,使执行速度略微低一点,比之于前面实现的不使用List列表来处理。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1