Java是一個純的面向物件的程式設計語言,它繼承了 C++ 語言面向物件技術的核心,Java捨棄了C ++語言中容易引起錯誤的指標(以引用取代)、運算子過載(operator overloading)、多重繼承(以介面取代)等特性,增加了垃圾回收器功能用於回收不再被引用的物件所佔據的記憶體空間,使得程式設計師不用再為記憶體管理而擔憂。以下是小編為大家搜尋整理的java通用組合演算法如何實現,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!
存在一個類似{31311133,33113330}這樣的集合,經過8取5組合,其他位置用非字母數字字元替代,比如使用*號,得到類似{3***1133,***13330,... ...}這樣的集合;
還要求對於{3***1133,***13330}這樣的集合,再次經過5取3組合,其他位置用非字母數字字元替代,比如使用*號,得到類似{*****133,*****330,3***1*3*,... ...}這樣的集合。
對於這樣的要求,實現的思路如下:
首先,主要思想是基於資訊編碼原理,通過掃描字串,將10組合變為01組合。
其次,對於每個數字字串,設定一個單執行緒,在單執行緒類中設定一個List用來存放待處理數字字串(可能含有*號,或者不含有)中每個數字的(而非*號)索引位置值;
再次,設定BitSet來標誌每個位置是否被*號替換得到新的組合字串。
最後,在掃描原始待處理數字字串的`過程中,根據設定的字元列表List中索引,來操作BitSet,對於每一個BitSet得到一個新的組合。
使用Java語言實現如下:
package drn;
import yList;
import et;
import ection;
import ections;
import Set;
import ator;
import ;
/**
* 通用組合拆分類(基於單執行緒)
*
* 可以完成兩種功能:
*
* 第一,可以將完全數字串拆分成為含有*號的字串。
* 例如:輸入集合{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) {
icate = duplicate;
Count = starCount;
if(icate) { // 根據指定是否去重的選擇,選擇建立容器
filteredContainer = hronizedSet(new HashSet());
}
else {
filteredContainer = hronizedList(new ArrayList());
}
Iterator it = ator();
while(ext()) {
new Thread(new SplitterThread(()()))t();
}
try {
p(50);
} catch (InterruptedException e) {
tStackTrace();
}
}