2016-05-25 483 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'並且使用'!unique',你的意思是「不是'唯一''」。 2)使用'java.util.Random'生成一個具有上限的整數。 3)將遏制邏輯放在一個單獨的方法中。你的錯誤會很明顯,你的程序可以表示爲'while(idExisists(randomID))randomID = rnd.nextInt(99999);'。 – aioobe

回答

4

如果你需要的是一個唯一的標識符(即不一定是連續的),它不到風度必須是一個整數,看看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級新的IDS後,我試圖生成150000更多:

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

和...它的工作原理非常好!只花了一分鐘左右(這是有道理的)。 如果我嘗試創建只有15,000條記錄,它在不到一秒鐘內就可以工作。

這使我得出這樣的結論,即錯失率指數級地高,並且一旦達到IDS容量的15%,就會開始無法忍受。

不要繼續使用此解決方案。 使用不同的方法,如存儲的連續編號(如果您存儲記錄)。如果你沒有存儲記錄,我沒有看到爲什麼不使用靜態int變量的原因。