Борьба с получением идентификатора от пользователя

Моя идея сделать - сделать уникальный ID для каждого пользователя. Он содержит как символы, так и целые. Первые две буквы идентификатора будут инициалами имени пользователя, четыре следующих должны указывать год, а последние три - случайные.

public String getUserID(){
    String[] ID = new String[9];
    ID[0] = String.valueOf(name.charAt(1));
    ID[1] = String.valueOf(surname.charAt(2));
    int years = Date_Of_Birth.getYear();
    int[] numOfYears = new int[4];
    for(int i = 0; i < 4; i++)
    {
        int a = years%10;
        a = numOfYears[i];
        years /= 10;
        ID[i] = numOfYears[i]; // Java.lang.string, not int
    }
    Random random = new Random();
    int a = Integer.toString(random.nextInt(9)); // Java.lang.string, not int
    int b = random.nextInt(9) + 1;
    int c = random.nextInt(9) + 1;
    ID[7] = a;
    ID[8] = b;
    ID[9] = c;

}

Я борюсь с заменой интеграторов на строки, а также наоборот. Я пробовал несколько вещей вроде String.valueOf () или целых чисел, но все это кажется безнадежным.

Можно использовать Integer.toString(int)

Héctor 14.12.2018 18:30

Не могли бы вы уточнить, какие у вас проблемы с String.valueOf(int) и Integer.valueOf( String)?

Andy Thomas 14.12.2018 18:30

Я думаю, что у вас есть одна проблема, заключающаяся в том, что у вас есть массив строк String[] ID = new String[9], но это дает вам девять разных струн. Возможно, вам нужна всего одна строка для идентификатора, и вам следует использовать конкатенацию («строка» + «один») или StringBuilder, чтобы получить строку идентификатора.

markspace 14.12.2018 18:38

Оба IDEA показывают, что это несовместимые типы, требуется - int, а задано - java.lang.string.

Yashiru99 14.12.2018 18:43

Я попробую построить одну струну!

Yashiru99 14.12.2018 18:44

Немного изменил его, как предложил @markspace. Вместо того, чтобы использовать полный идентификатор в виде массива, я сгруппировал его в более мелкие массивы и целые числа и суммировал их как целую строку.

Yashiru99 14.12.2018 18:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проверь это:

public String getUserID(){
    StringBuilder sb = new StringBuilder();

    sb.append(name.substring(0, 1));
    sb.append(surname.substring(0, 1));
    sb.append(String.valueOf(Date_Of_Birth.getYear()));

    Random random = new Random();
    for (int i = 1; i <= 3; i++) {
        int a = random.nextInt(9) + 1;
        sb.append(String.valueOf(a));
    }
    return sb.toString();
}

он использует SringBuilder для пошагового построения идентификатора:

  • добавляет 1-й символ name
  • добавляет 1-й символ surname
  • добавляет год (при условии, что это 4 цифры, возвращаемые Date_Of_Birth.getYear())
  • внутри цикла добавляются 3 однозначных случайных числа
  • возвращает строку StringBuilder

Алгоритм не гарантирует уникальный идентификатор пользователя. Вы также должны проверить, существует ли уже идентификатор пользователя, и повторять генерацию случайных чисел, пока не получите уникальный идентификатор пользователя. Также может быть, что трех цифр недостаточно, например, если имя пользователя - Джеймс Смит или другое имя, которое в настоящее время очень популярно. Наиболее распространенные имена

Jonathan Rosenne 14.12.2018 20:10

@JonathanRosenne, конечно, нет. Это просто способ OP для получения идентификатора.

forpas 14.12.2018 20:23
Ответ принят как подходящий

Используйте StringBuilder, чтобы построить только один String вместо массива String[].

Random random = new Random();
StringBuilder builder = new StringBuilder();
builder.append(name.charAt(1))
       .append(surname.charAt(2))
       .append(Date_Of_Birth.getYear())
       .append(100 + random.nextInt(900)));
return builder.toString();

Это отличное решение, но разве random.nextInt(900) не вернет максимум 900? И 900 + 100 = 1000, что означает, что есть вероятность, что последнее добавление строки будет состоять из 4 символов вместо 3?

cokeby190 14.12.2018 19:13

@ cokeby190 верхняя граница 900 не включает, поэтому вызов возвращает числа [0, 899] согласно javadoc.

Karol Dowbecki 14.12.2018 20:05

да ладно понял! Это действительно отличный способ получить трехзначное случайное число! (:

cokeby190 14.12.2018 20:09

После изменений код выглядит так, на мой взгляд, все в порядке.

public String getUserID(){
        String[] IDletters = new String[2];
        IDletters[0] = String.valueOf(name.charAt(1));
        IDletters[1] = String.valueOf(surname.charAt(2));
        int years = Date_Of_Birth.getYear();
        int[] numOfYears = new int[4];
        for(int i = 0; i < 4; i++)
        {
            int a = years%10;
            a = numOfYears[i];
            years /= 10;
        }
        Random random = new Random();
        int a = random.nextInt(9)+1;
        int b = random.nextInt(9)+1;
        int c = random.nextInt(9)+1;
        String wholeID = IDletters[0]+IDletters[1]+numOfYears[0]+numOfYears[1]+numOfYears[2]+numOfYears[3]+ a + b + c;
        return wholeID;

    }

Другие вопросы по теме