Java は一般的な組み合わせアルゴリズムを実装しています。{31311133,33113330} のようなセットがあります。5 つの組み合わせのうち 8 つが終わると、他の位置は * などの英数字以外の文字に置き換えられ、{3***1133,***13330,... ...} のようなセットが得られます。 現在、次のような需要があります。 {31311133,33113330} のようなセットがあります。8 個中 5 個以降は、他の位置が * などの英数字以外の文字に置き換えられ、{3***1133,***13330,... ...} のようなセットになります。 また、{3***1133,***13330} のようなセットの場合、5 つの組み合わせのうち 3 つを再度取得し、他の位置を * などを使用して英数字以外の文字に置き換えて、{*****133,*****330,3***1*3*,... ...} のようなセットを取得する必要があります。 このような要件に対する実装のアイデアは次のとおりです。 まず、主なアイデアは情報エンコードの原理に基づいています。文字列をスキャンすると、10 の組み合わせが 01 の組み合わせに変更されます。 次に、数値文字列ごとに 1 つのスレッドを設定し、その単一スレッド クラスにリストを設定して、処理対象の数値文字列 (* が含まれる場合も含まれない場合もあります) 内の各数値 (* ではない) のインデックス位置値を格納します。 ここでも、各位置が * に置き換えられて新しい結合文字列が取得されるかどうかをマークするように BitSet を設定します。 ***、処理対象となる元のデジタル文字列をスキャンするプロセスでは、設定された文字リスト List 内のインデックスに従って BitSet が操作され、BitSet ごとに新しい組み合わせが得られます。 Java言語を使用した実装は次のとおりです。 - パッケージorg.shirdrn;
- java.util.ArrayListをインポートします。
- java.util.BitSetをインポートします。
- java.util.Collectionをインポートします。
- java.util.Collectionsをインポートします。
- java.util.HashSetをインポートします。
- java.util.Iteratorをインポートします。
- java.util.Listをインポートします。
-
-
-
-
-
-
-
-
-
-
-
-
- 公共 クラスCommonSplitter {
- プライベート 星の数を整数で表します。
- プライベート ブール値の重複;
- プライベートコレクションfilteredContainer;
- パブリックコレクション getFilteredContainer() {
- フィルターされたコンテナを返します。
- }
-
-
-
-
- パブリックCommonSplitter(コレクション コンテナ、 int starCount、 boolean重複) {
- this .duplicate = 重複;
- .starCount = starCount;です。
- if ( this .duplicate) {
- フィルターコンテナ = Collections.synchronizedSet(新しいHashSet());
- }
- それ以外{
- フィルターコンテナ = Collections.synchronizedList(新しいArrayList());
- }
- イテレータ it = container.iterator();
- (it.hasNext())の間{
- 新しいスレッド(新しいSplitterThread(it.next().trim())).start();
- }
- 試す{
- スレッド.スリープ( 50 );
- }キャッチ(InterruptedException e) {
- e.printStackTrace();
- }
- }
-
-
-
-
-
- クラスSplitterThreadはRunnableを実装します{
- プライベート char [] char配列;
- プライベート int len;
- List occupyIndexList = new ArrayList();
- プライベートリストコンテナ =新しいArrayList();
- private BitSet startBitSet;
- private BitSet endBitSet;
- パブリックスプリッタースレッド(文字列文字列) {
- これは.charArray = string.toCharArray() です。
- this .len = string.replace( "*" , "" ).length();
- this .startBitSet = new BitSet(len);
- this .endBitSet = new BitSet(len);
-
- intカウント = 0 ;
- ( int i = 0 ; iの場合
- charArray[i] != '*'の場合{
- カウント < スターカウントの場合
- これを.startBitSet.set(i, true );
- カウント++;
- }
- 占有インデックスリストを追加します(i);
- }
- }
-
- カウント = 0 ;
- ( int i = string.length()- 1 ; i > 0 ; i--) {
- charArray[i] != '*'の場合{
- カウント < スターカウントの場合
- これを.endBitSet.set(i, true );
- カウント++;
- }
- ccupyIndexList.add(i);
- }
- }
-
- char [] charArrayClone = this .charArray.clone();
- ( int i = 0 ; iの場合
- if ( this .startBitSet.get(i)) {
- charArrayClone[i] = '*' ;
- }
- }
- これを.container.add(新しいString(charArrayClone) );
- }
- 公共 void実行() {
- これは.split();
- 同期された(フィルターされたコンテナ){
- フィルターされたコンテナ.addAll(この.コンテナ);
- }}
- 公共 void分割() {
- while (! this .startBitSet.equals( this .endBitSet)) {
- int zeroCount = 0 ;
- int oneCount = 0 ;
- int pos = 0 ;
- char [] charArrayClone = this .charArray.clone();
-
- ( int i = 0 ; iの場合
- if (! this .startBitSet.get( this .occupyIndexList.get(i))) {
- ゼロカウント++;
- }
- if ( this .startBitSet.get( this .occupyIndexList.get(i))
- && ! this .startBitSet.get( this .occupyIndexList.get(i+ 1 ))) {
- 位置 = i;
- 1 カウント = i - ゼロカウント;
-
- this .startBitSet.set( this .occupyIndexList.get(i), false );
- this .startBitSet.set( this .occupyIndexList.get(i+ 1 ), true );
- 壊す;
- }
- }
-
- int count = Math.min(zeroCount, oneCount);
- int startIndex = this .occupyIndexList.get( 0 );
- int終了インデックス = 0 ;
- 位置が1 かつカウントが0の場合
- pos--;
- endIndex = this .occupyIndexList.get(pos);
- ( int i = 0 ; iの場合
- これを.startBitSet.set(startIndex, true );
- これを.startBitSet.set(endIndex, false );
- startIndex = this .occupyIndexList.get(i + 1 );
- pos--;
- (位置> 0 )の場合{
- endIndex = this .occupyIndexList.get(pos);
- }
- }}
-
- ( int i = 0 ; iの場合
- if ( this .startBitSet.get( this .occupyIndexList.get(i))) {
- charArrayClone[ this .occupyIndexList.get(i)] = '*' ;
- }
- }
- これを.container.add(新しいString(charArrayClone) );
- }
- }}}
#p# テストケースは次のとおりです。 - パッケージorg.shirdrn;
- java.util.ArrayListをインポートします。
- java.util.Collectionをインポートします。
- junit.framework.TestCaseをインポートします。
- org.shirdrn.util.GoodToolsをインポートします。
- 公共 クラスTestCommonSplitter はTestCaseを拡張します{
- プライベートCommonSplitter スプリッター;
- 公共 void setSplitter(コレクションコンテナ、 int starCount、 boolean duplicate) {
- this .splitter = new CommonSplitter(container, starCount, duplicate);
- }
- 公共 void testSplitter() {
- コレクションコンテナー = new ArrayList();
- コンテナを追加します( "1*10**" );
- スターカウント= 2 ;
- ブール値の重複 = true ;
- this .setSplitter(コンテナ、starCount、複製);
- System.out.println(この.splitter.getFilteredContainer());
- }
- 公共 void testSplitter3() {
- コレクションコンテナー = new ArrayList();
- コンテナを追加します( "1*10*1300*" );
- スターカウント= 3 ;
- ブール値の重複 = true ;
- this .setSplitter(コンテナ、starCount、複製);
- System.out.println(この.splitter.getFilteredContainer());
- assertEquals( 35 、この.splitter.getFilteredContainer().size());
- }
- 公共 void testNoStar() {
- コレクションコンテナー = new ArrayList();
- コンテナを追加します( "3110330" );
- スターカウント= 3 ;
- ブール値の重複 = true ;
- this .setSplitter(コンテナ、starCount、複製);
- System.out.println(この.splitter.getFilteredContainer());
- assertEquals( 35 、この.splitter.getFilteredContainer().size());
- }
- 公共 void testSplitter_8_310() {
-
- 文字列 multiSeq = "310,310,310,310,310,310,310,310" ;
- コレクション コンテナー = GoodTools.getNSingleList(multiSeq);
- assertEquals( 6561 , コンテナのサイズ());
- スターカウント= 4 ;
- ブール値の重複 = false ;
- this .setSplitter(コンテナ、starCount、複製);
- assertEquals( 459270 、この.splitter.getFilteredContainer().size());
- }
- }
上記のテストには約 2 秒かかります。 上記のアルゴリズムは、主に次の 2 つの条件に対して実装されます。 *** は完全な数値文字列です -> * を含む結合された数値文字列です。 アスタリスクが付いた 2 番目の結合デジタル文字列 --> これを基に結合を続行して、アスタリスクが付いた結合デジタル文字列を取得します。 上記のアルゴリズムを使用して最初の条件を処理する場合、リストを使用してインデックスを記録するため、リストを使用せずに処理する以前の実装と比較して、実行速度がわずかに低下します。 【編集者のおすすめ】 - Java オブジェクト インスタンスはいつ作成されますか?
- Javaプログラミングを学ぶ8つのメリット
- Java マルチスレッド プログラミングの詳細な分析
- 開発者が犯す最も一般的な JavaScript の間違い 13 個
|