Перейти к основному содержимому

Java — генерировать случайную строку

· 4 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Введение

В этом руководстве мы узнаем, как сгенерировать случайную строку в Java, сначала используя стандартные библиотеки Java, затем вариант Java 8 и, наконец, используя библиотеку Apache Commons Lang .

Эта статья является частью серии «Java — Back to Basic» здесь, на ForEach.

2. Сгенерируйте случайную неограниченную строку с помощью простой Java

Давайте начнем с простого и сгенерируем случайную строку , ограниченную 7 символами:

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
byte[] array = new byte[7]; // length is bounded by 7
new Random().nextBytes(array);
String generatedString = new String(array, Charset.forName("UTF-8"));

System.out.println(generatedString);
}

Имейте в виду, что новая строка не будет чем-то отдаленно буквенно-цифровым.

3. Сгенерируйте случайную ограниченную строку с помощью простой Java

Далее давайте посмотрим на создание более ограниченной случайной строки; мы собираемся сгенерировать случайную строку , используя строчные буквы алфавита и заданную длину:

@Test
public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {

int leftLimit = 97; // letter 'a'
int rightLimit = 122; // letter 'z'
int targetStringLength = 10;
Random random = new Random();
StringBuilder buffer = new StringBuilder(targetStringLength);
for (int i = 0; i < targetStringLength; i++) {
int randomLimitedInt = leftLimit + (int)
(random.nextFloat() * (rightLimit - leftLimit + 1));
buffer.append((char) randomLimitedInt);
}
String generatedString = buffer.toString();

System.out.println(generatedString);
}

4. Сгенерируйте случайную буквенную строку с помощью Java 8

Теперь давайте воспользуемся Random.ints, добавленным в JDK 8, для генерации буквенной строки:

@Test
public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() {
int leftLimit = 97; // letter 'a'
int rightLimit = 122; // letter 'z'
int targetStringLength = 10;
Random random = new Random();

String generatedString = random.ints(leftLimit, rightLimit + 1)
.limit(targetStringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();

System.out.println(generatedString);
}

5. Генерация случайной буквенно-цифровой строки с помощью Java 8

Затем мы можем расширить наш набор символов, чтобы получить буквенно-цифровую строку:

@Test
public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() {
int leftLimit = 48; // numeral '0'
int rightLimit = 122; // letter 'z'
int targetStringLength = 10;
Random random = new Random();

String generatedString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(targetStringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();

System.out.println(generatedString);
}

Мы использовали описанный выше метод фильтрации , чтобы пропустить символы Юникода между 65 и 90, чтобы избежать появления символов вне допустимого диапазона.

6. Генерация ограниченной случайной строки с помощью Apache Commons Lang

Библиотека Commons Lang от Apache очень помогает при генерации случайных строк. Давайте посмотрим на создание ограниченной строки , используя только буквы :

@Test
public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() {

int length = 10;
boolean useLetters = true;
boolean useNumbers = false;
String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);

System.out.println(generatedString);
}

Таким образом, вместо всего низкоуровневого кода в примере с Java здесь используется простой однострочный код.

7. Генерация алфавитной строки с помощью Apache Commons Lang

Вот еще один очень простой пример, на этот раз ограниченная строка только с буквенными символами, но без передачи логических флагов в API:

@Test
public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
String generatedString = RandomStringUtils.randomAlphabetic(10);

System.out.println(generatedString);
}

8. Сгенерируйте буквенно-цифровую строку с помощью Apache Commons Lang

Наконец, у нас есть та же самая случайная ограниченная строка, но на этот раз числовая:

@Test
public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
String generatedString = RandomStringUtils.randomAlphanumeric(10);

System.out.println(generatedString);
}

И вот, мы создали ограниченные и неограниченные строки либо с помощью простой Java, либо с вариантом Java 8, либо с библиотекой Apache Commons.

9. Заключение

Благодаря различным методам реализации мы смогли генерировать связанные и несвязанные строки, используя обычную Java, вариант Java 8 или библиотеку Apache Commons.

В этих примерах Java мы использовали java.util.Random , но стоит упомянуть, что он не является криптографически безопасным. Рассмотрите возможность использования java.security.SecureRandom вместо приложений, чувствительных к безопасности.

Реализацию всех этих примеров и сниппетов можно найти в проекте GitHub . Это проект на основе Maven, поэтому его легко импортировать и запускать.