Java實現通用組合算法
現在有這樣的需求
存在一個類似{
還要求對於{
對於這樣的要求
首先
其次
再次
最後
使用Java語言實現如下
package org
import java
import java
import java
import java
import java
import java
import java
/**
* 通用組合拆分類(基於單線程)
* 可以完成兩種功能
* 第一
* 例如
* 線程來處理
* 第二
* 例如
* CommonSplitter類會遍歷該集合
* 線程來處理
* @author 時延軍
*/
public class CommonSplitter {
private int starCount;
private boolean duplicate;
private Collection filteredContainer;
public Collection getFilteredContainer() {
return filteredContainer;
}
/**
* 構造一個Spilitter實例
* @param container 輸入的待處理字符串集合
* @param starCount 如果對於長度為N的數字字符串
* @param duplicate 是否去重
*/
public CommonSplitter(Collection container
this
this
if(this
filteredContainer = Collections
}
else {
filteredContainer = Collections
}
Iterator it = erator();
while(it
new Thread(new SplitterThread(it
}
try {
Thread
} catch (InterruptedException e) {
e
}
}
/**
* 對一個指定的N場比賽的長度為N的單式投注字符串進行組合
* 輸入單式投注注字符串string
*
* @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
this
this
this
// 初始化startBitSet
int count =
for (int i=
if(charArray[i] !=
if(count < starCount) {
this
count++;
}
occupyIndexList
}
}
// 初始化endBit
count =
for (int i = string
if(charArray[i] !=
if(count < starCount) {
this
count++;
}
ccupyIndexList
}
}
// 根據起始startBitSet
char[] charArrayClone = this
for (int i=
if (this
charArrayClone[i] =
}
}
ntainer
}
public void run() {
this
synchronized(filteredContainer) {
filteredContainer
}}
public void split() {
while(!this
int zeroCount =
int oneCount =
int pos =
char[] charArrayClone = this
// 遍歷startBitSet來確定
for (int i=
if (!this
zeroCount++;
}
if (this
&& !this
pos = i;
oneCount = i
// 將
this
this
break;
}
}
// 將遇到
int count = Math
int startIndex = this
int endIndex =
if(pos>
pos
endIndex = this
for (int i=
this
this
startIndex = this
pos
if(pos>
endIndex = this
}
}}
// 將遇到
for (int i=
if (this
charArrayClone[this
}
}
ntainer
}
}}}
測試用例如下所示
package org
import java
import java
import junit
import org
public class TestCommonSplitter extends TestCase {
private CommonSplitter splitter;
public void setSplitter(Collection container
this
}
public void testSplliter() {
Collection container = new ArrayList();
container
int starCount =
boolean duplicate = true;
this
System
}
public void testSplliter
Collection container = new ArrayList();
container
int starCount =
boolean duplicate = true;
this
System
assertEquals(
}
public void testNoStar() {
Collection container = new ArrayList();
container
int starCount =
boolean duplicate = true;
this
System
assertEquals(
}
public void testSplitter_
//
String multiSeq =
Collection container = GoodTools
assertEquals(
int starCount =
boolean duplicate = false;
this
assertEquals(
}
}
上述測試耗時大約
上述算法實現主要是針對兩種條件進行實現的
第一個是完全數字字符串 ——> 帶有*號的組合數字字符串
第二個帶有*號的組合數字字符串 ——> 在該基礎上繼續組合得到帶有*號的組合數字字符串
如果使用上述算法實現處理第一個條件
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25538.html