2016-05-25 61 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变量的原因。