Не в состоянии генерировать уникальный номер пользователя

У меня проблема при попытке создать уникальный идентификатор клиента в моем приложении. Я хочу, чтобы числа начинались с 1 и увеличивались. У меня есть регистр-класс, использующий древовидную карту, которая генерирует следующий номер клиента, используя этот код:

public String generateNumber()
{
    int number = 1;

    for(Map.Entry<String, Forsikringkunde> entry : this.entrySet())
    {
        if(entry.getValue().getNumber().equals(String.valueOf(number)))
        {
            number++;
        } 
    }return String.valueOf(number);
}

Когда я генерирую клиентов в своем приложении, я получаю дубликаты чисел, хотя я перебираю карту. При создании клиента я создаю объект, запускаю этот метод, использую метод set для идентификатора и добавляю его в реестр, но он не работает. У кого-нибудь есть решение?

2 ответа

Решение

Измените код, чтобы вместо этого найти максимальное число на вашей карте, а затем используйте это + 1:

public String generateNumber()
{
    int max = -1;

    for(Map.Entry<String, Forsikringkunde> entry : this.entrySet())
    {
        int entry = Integer.parseInt(entry.getValue().getNumber());
        if(entry > max)
        {
            max = entry;
        } 
    }
    return String.valueOf(max + 1);
}

(Это имитирует ваш стиль кодирования. Ответ aioobe показывает, как сделать то же самое более элегантно.)

Ваш метод не работает, потому что карта не повторяется по порядку. Например, вот что происходит, если вы перебираете двух пользователей с номером 2 а также 1 соответственно:

  1. Начните с "число = 1"
  2. Проверить, если number == 2: нет, так что продолжайте
  3. Проверить, если number == 1: так и есть number = 2

Теперь цикл завершен и number равен 2, даже если пользователь с идентификатором 2 уже существует. Если бы это было повторено по порядку, это сработало бы.

Если вы работаете на Java 8, я предлагаю вам попробовать это:

int max = this.values()
              .stream()
              .map(Forsikringkunde::getNumber)
              .mapToInt(Integer::parseInt)
              .max()
              .orElse(0);

return String.valueOf(max + 1);
Другие вопросы по тегам