简述Java程序语言通用组合算法的实现(二)

2014-11-24 10:51:10 · 作者: · 浏览: 2
(charArray[i] != '*') {
if(count < starCount) {
this.endBitSet.set(i, true);
count++;
}
ccupyIndexList.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;
}
}
// 将遇到10后,左侧的1全部移动到最左侧
int count = Math.min(zeroCount, oneCount);
int startIndex = this.occupyIndexList.get(0);
int endIndex = 0;
if(pos>1 && count>0) {
pos--;
endIndex = this.occupyIndexList.get(pos);
for (int i=0; i
this.startBitSet.set(startIndex, true);
this.startBitSet.set(endIndex, false);
startIndex = this.occupyIndexList.get(i+1);
pos--;
if(pos>0) {
endIndex = this.occupyIndexList.get(pos);
}
}}
// 将遇到1的位置用*替换
for (int i=0; i
if (this.startBitSet.get(this.occupyIndexList.get(i))) {
charArrayClone[this.occupyIndexList.get(i)] = '*';
}
}
this.container.add(new String(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, 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_