2016-05-25 8 views
1

static nextIDフィールドを増やすことなく、クラス内の各オブジェクトに新しい一意識別子を生成しようとしています。これを使用すると、プログラムをアンロードしたりアンロードしたりするときに問題が発生します。一意のオブジェクトIDを生成

私は静的メソッドでオブジェクトをループするソリューションを考え出しましたが、私には何らかの未知の理由があってもwhileループを終了しません。

ideone.comでテストしていますhere 5つのオブジェクトを作成しようとしましたが、作成することはありません。

テストコード全体を表示するリンクに移動することなく、私が使用している方法は次のとおりです。

public static int newRandomID() { 
    int randomID = 0; 
    boolean notUnique = true; 

    while (notUnique) { 
     randomID = (int) (Math.random() * 999999 + 1); 
     for (Example e : examples) { 
      if (e.ID == randomID) { 
       notUnique = true; 
       break; 
      } 
      notUnique = false; 
     } 
    } 
    return randomID; 
} 

私は見えないほど愚かなミスを犯したのですか、これがうまくいかない理由はありますか?

+3

一般的なポインタのカップル:1)必要以上に複雑な名前にしないでください。 'notUnique'を単に' unique'に変更し、 'not unique'を' not unique'としてください。 2) 'java.util.Random'を使用して、上限を持つ整数を生成します。 3)封じ込め論理を別の方法で入れる。あなたの間違いは明らかで、あなたのプログラムは 'while(idExisists(randomID))randomID = rnd.nextInt(99999);'と表現することができます。 – aioobe

答えて

4

あなたが必要とするすべての一意の識別子(シーケンシャルである必要がないこと)であり、それは整数でなければならないdosn't場合は、java.util.UUID

+0

質問が「これはうまくいかない理由はありますか?」 –

+1

私はより大きな問題を「私は各オブジェクトの新しい一意の識別子を生成しようとしています。 –

0

で見て、あなたのnotUniqueは少し混乱で、私はあなたがやっていると思いますそれは間違った

if (e.ID == randomID) { 
      notUnique = true; 
      break; 
} 

ここであなたは idが存在する場合に文を分割する必要がありいけません。私はあなたのコードを変更することができますこれは役立ちます。

int randomID = 0; 
    boolean ContinueLoop = true; 

    while (ContinueLoop) { 
     randomID = (int) (Math.random() * 999999 + 1); 
     boolean exist = false; 
     for (Example e : examples) { 
      if (e.ID == randomID) { 
       exist = true; 
      }else{ 
       exist = false; 
       break; 
      } 

     } 

     if(exist==false){ 
      ContinueLoop = false; 
     }else{ 
      ContinueLoop = true; 
     } 

    } 
    return randomID; 
0

は(あなたが送信されたリンクから)あなたのコードを実行しようとしました: あなたは50の新しいIDを作成し、印刷した後、私15万以上を生成しようとしました:

for (int i = 0; i < 150000; i++) 
     new Example(); 

と...それは動作します完璧に良い!ちょうど1分ほどかかりました(意味があります)。 わずか15,000レコードを作成しようとすると、1秒未満で動作します。

これは、ミス率が指数関数的に高く、IDの容量の15%に達すると耐え難くなると結論づけます。

この解決方法を続行しないでください。 レコードを格納する場合は、格納されたシーケンシャル番号などの別の方法を使用します。レコードを格納しない場合は、静的なint変数を使用しない理由はありません。

関連する問題