2016-10-19 26 views
1

私の目標は、例えば、固定長の繰り返しアルファベット/数字文字列を生成することです:固定長で、アルファベット/数字の文字列を生成

aaaaaa 
aaaaab 
aaaaac 
... 
aaaaa9 
aaaaba 
... 
999999 

それは簡単に以下のコードのように、forループのネストされたで実装することができます。

public static void main(String[] strings) { 
     Object[] array = new Object[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 
       'y', 'z', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
     List<String> list = Lists.newArrayList(); 
     int a, b, c, d, e, f; 
     for (a = 0; a < 35; a++) { 
      for (b = 0; b < 35; b++) { 
       for (c = 0; c < 35; c++) { 
        for (d = 0; d < 35; d++) { 
         for (e = 0; e < 35; e++) { 
          for (f = 0; f < 35; f++) { 
           list.add("" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

しかし、このようなコードを複数のスレッドで実行する可能性や、そのような数を生成するためにいくつかのライブラリが既に存在する可能性があることを知っておくとよいでしょう。

ご協力いただければ幸いです。

+0

を使用することができますです/codereview.stackexchange.com/はこれに適しています。 – Rao

+0

あなたが必要とするものはまだわかりません。アルファベットまたは数字のいずれか、あるいはその両方を含む固定長の文字列を言うときは?必要なもの?はい、間違いなく5つのネストされたループ ' –

+0

こんにちはShreyas Sarvothamaの代わりに、最適化することができます。だから、主な考え方は、例のように文字列の長さを固定することです。長さは6に等しくなければなりません。文字列はアルファベットと数字の両方を含むことができます – fashuser

答えて

8

あなたは35^6 = 1838265625の値を生成しています。あなたがループのための単一を使用して、それを書き換えることができます。

だから、
for (int i = 0; i < 1838265625; ++i) { 
    int ii = i; 
    int f = ii % 35; ii /= 35; 
    int e = ii % 35; ii /= 35; 
    int d = ii % 35; ii /= 35; 
    // ... 
    int a = ii % 35; 

    list.add("" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]); 
} 

、ちょうどあなたのスレッド間の範囲[0..1838265625)を分割、複数のスレッドに書き換えることなので、各スレッドは、その範囲の部分のためのforループを実行します例えばスレッド1は[0..1_000_000)、スレッド2は[1_000_000..2_000_000)など

ForkJoinPoolを使用すると、手作業ではなく範囲の分割と結合を簡単に管理できます。


もちろん、以前のJava 8の用語で考えています。 (GhostCatにより示唆されるように)また、ストリームでそれを行うことができます。

IntStream.range(0, 1838265625).parallelStream() 
    .map(i -> { 
     int ii = i; 
     int f = ii % 35; ii /= 35; 
     int e = ii % 35; ii /= 35; 
     int d = ii % 35; ii /= 35; 
     // ... 
     int a = ii % 35; 
     return "" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]; }) 
    .collect(someCollector); 
+0

迅速な対応のために非常に多くのAndyに感謝し、ForkJoinPoolとjava 8の両方のオプションを試してみましょう! – fashuser

+0

@fashuserまずJava 8を試してください。 –

+2

@AndyTurner、 'i/= 35'は' ii/= 35'ですか? – chengpohi

0

私はあなたのコードはjava8ストリームを用いて溶液に変換することができると思い。そして、あなたは単純にストリーム()ベースのソリューションからparallelStream()ソリューションに進むことができます。

欠点は、ストリームのみ参照型/コレクションで動作するということです。そのため、生のchar配列を使用しないことでパフォーマンスが低下する可能性があります。

1

私はそう答えとして投稿し、コメントするには50ポイントを持っていません。

なぜそんなにネストされたループが必要なのでしょうか? 2つのループで十分でした。配列の長さを計算し、あなたは6つの場所で35文字のすべての順列を取得したい場合、私はあなたがそのためStackOverflowExceptionがを得るだろうと信じてい

for (i=0;i<length;i++) 
{ 
    for(i=0;i<6;i++) 
    { 
     //what to do 
    } 
} 
0
  • 同様length

    に保管してくださいそれぞれが20GBのメモリである少なくとも12バイトの1'838'265'625エントリのリストになります。チャーは、わずか2(ユニコード)であるint値は4つのバイトを持っているので

  • は、第二のchar配列を使用します。連結の最後で

  • intが整数に送信トレイとcharにキャストしようと私はあなたがint型(例えばのASCII表現を得るだろうと思います。/:1「は、見出しの開始」、非印字文字)

  • は、httpかもしれませuは、固定長の言葉の有界乱数発生器を使用する場合は、あなたが

private static final String[] array = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", 
      "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; 

public List<String> randomWords(int numOfWords, int lengthOfWord){ 
    List<String> list = new ArrayList<>(); 
    for(int i = 0; i < numberOfWords; i++) 
     list.add(randomWord(lengthOfWord)); 

    return list; 
} 

private String randomWord(int lengthOfWord){ 
    Random rand = new Random(); 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < lengthOfWord; i++){ 
     sb.append(array[rand.nextInt(35)]); 
    } 
    return sb.toString(); 
} 
+0

ヒント:何も説明せずに答えを...単に良いアプローチではありません。人々を助けることは、単なるコードを落とすこと以上のものです! – GhostCat

+0

ランダム性を導入するのはなぜですか? OPは「いくつかの」値を求めておらず、彼はすべての*値を求めています。 –

+0

はい私はそれを認識していますが、私の午後は答を書いている途中で私を止めました。私は彼がメモリ不足のために有効な目標を持っていないことを認識しているので、ランダム性を導入します。 – Zildyan

関連する問題