/**
* 对一个指定的N场比赛的长度为N的单式投注字符串进行组合
* 输入单式投注注字符串string,例如31311133,组合得到类似******33,*****1*3,... ...结果的集合
*
* @author 时延军
*
*/
class SplitterThread implements Runnable {
private char[] charArray;
private int len; // 数字字符的个数
List
private List
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);
// 初始化startBitSet,左侧占满*符号
int count = 0; //
for (int i=0; i if(charArray[i] != '*') { if(count < starCount) { this.startBitSet.set(i, true); count++; } occupyIndexList.add(i); } } // 初始化endBit,右侧占满*符号 count =0; for (int i = string.length()-1; i > 0; i--) { if(charArray[i] != '*') { if(count < starCount) { this.endBitSet.set(i, true); count++; } occupyIndexList.add(i); } } // 根据起始startBitSet,构造带*的组合字符串并加入容器 char[] charArrayClone = this.charArray.clone(); for (int i=0; i if (this.startBitSet.get(i)) { charArrayClone[i] = '*'; } } this.container.add(new String(charArrayClone)); } public void run() { this.split(); synchronized(filteredContainer) { filteredContainer.addAll(this.container); } } public void split() { while(!this.startBitSet.equals(this.endBitSet)) { int zeroCount = 0; // 统计遇到10后,左边0的个数 int oneCount = 0; // 统计遇到10后,左边1的个数 int pos = 0; // 记录当前遇到10的索引位置 char[] charArrayClone = this.charArray.clone(); // 遍历startBitSet来确定10出现的位置 for (int i=0; i if (!this.startBitSet.get(this.occupyIndexList.get(i))) { zeroCount++; } if (this.startBitSet.get(this.occupyIndexList.get(i)) && !this.startBitSet.get(this.occupyIndexList.get(i+1))) { pos = i; oneCount = i - zeroCount; // 将10变为01 this.startBitSet.set(this.occupyIndexList.get(i), false); this.startBitSet.set(this.occupyIndexList.get(i+1), true); break; } }
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。