2016-05-25 4 views
1

Я пытаюсь создать новый уникальный идентификатор для каждого объекта в классе, не используя поле static nextID, чтобы просто увеличивать. Использование этого будет создавать сложности при разгрузке и разгрузке программы.Создать уникальный идентификатор объекта

Я придумал решение, чтобы пройти через объекты в статическом методе, проверяя их все, но по какой-то неизвестной причине для меня он не выйдет из цикла 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

Если все, что вам нужно, это уникальный идентификатор (что не должно быть последовательным) и dosn't должен быть целым числом, посмотреть на java.util.UUID

+0

Возможно, потому что вопрос в том, «есть ли причина, по которой это не работает?» –

+1

, поэтому я обратился к более крупной проблеме «Я пытаюсь создать новый уникальный идентификатор для каждого объекта» в beter way .... –

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 новых идентификаторов, я пытался произвести более 150000:

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

и ... это работает прекрасно! Просто занял минуту или около того (что имеет смысл). Если я попытаюсь создать только 15 000 записей, он работает менее чем за секунду.

Это приводит меня к выводу, что пропускная способность экспоненциально высока и начинает невыносима, как только вы достигнете 15% емкости идентификаторов.

Не оставляйте это решение. Используйте другой подход, такой как сохраненный порядковый номер (если вы храните записи). Если вы не храните записи, я не вижу причины, почему бы не использовать статическую переменную int.

Смежные вопросы