“涨姿势”:通用组合算法让你的Java技术更上一层楼

北大青鸟大学城校区logo 北大青鸟大学城校区
招生简章校园环境师资力量就业明星招生问答软件工程师北京大学学历学员项目联系我们 报名通道

免费在线咨询通道>>

免费在线报名通道>>

北大青鸟报名电话
当前位置:北大青鸟 > IT培训 > 电脑培训 >

“涨姿势”:通用组合算法让你的Java技术更上一层楼

标签:   分类:电脑培训

在Java的世界里,随着技术的更新和新技术的创新,存在着无穷的算法合集,在这些新的技能出现时,我们要如何来用一种适用于各种技术的算法呢?下面来看一下新的技术展示。我们通常可以看到这样的情况,{31311133,33113330}经过8取5组合,其他位置用非字母数字字符替代,比如使用*号,得到类似{3***1133,***13330,... ...}这样的集合;
  使用Java语言实现如下:
package org.shirdrn;
import java.util.ArrayList;
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组合,即starCount=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 boolean 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 starCount, 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()) {
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 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("*", "").length();
this.startBitSet = new BitSet(len);
this.endBitSet = new BitSet(len);
测试用例如下所示:
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, int 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(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.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.splitter.getFilteredContainer().size());
}
public void testSplitter_8_310() {
// 8 场:310
String 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左右。如此“涨姿势”的技能你学会了吗?

若有疑问请拨打北大青鸟咨询热线:010-80146691或点击免费在线咨询!
  • xml地图 网站地图 招生简章 合作企业 学员项目 联系我们
  • 关闭窗口