Создайте 5 случайных строк и добавьте их в набор в Java - PullRequest
3 голосов
/ 01 апреля 2020

Я новичок в Java и имею следующую проблему:

Как мне сгенерировать 5 случайных строк и добавить их в Set?

Ответы [ 7 ]

7 голосов
/ 01 апреля 2020

Сначала давайте создадим набор:

Set<String> set = new HashSet<>();

Теперь давайте сгенерируем 5 случайных строк. Есть много способов сделать это, здесь ответ на этот вопрос. Но поскольку вы не запрашивали указанную c длину, давайте продолжим:

String randomStr = Long.toHexString(Double.doubleToLongBits(Math.random()));

Теперь давайте повторим случайную генерацию 5 раз:

for (int i = 0; i < 5; i++) {
    set.add(Long.toHexString(Double.doubleToLongBits(Math.random())));
}

Теперь проблема в том, что это не гарантирует, что в наборе будет 5 случайных строк, как у нас могут быть похожие. Чтобы убедиться в этом, мы должны сделать:

while (set.size() < 5) {
    set.add(Long.toHexString(Double.doubleToLongBits(Math.random())));
}

Приведенный выше код будет продолжать генерировать случайные строки до тех пор, пока набор не будет содержать хотя бы 5. Я не проверяю, содержит ли он уже эту строку, потому что набор по определению , не содержит повторяющихся элементов . Таким образом, добавление дубликата не увеличит размер.

3 голосов
/ 01 апреля 2020

Вы можете сделать что-то вроде

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        Random random = new Random();
        while (set.size() != 5) {
            set.add(String.valueOf((char) (65 + random.nextInt(26))));
        }
        System.out.println(set);
    }
}

Пример прогона:

[D, X, L, M, N]

Примечания:

  1. Random.nextInt(n) генерирует int от 0 до n-1, где n представляет собой int. Следовательно, 65 + random.nextInt(26)) сгенерирует число от 65 до 90.
  2. String.valueOf(c) преобразует c в String, где c - это char.
  3. Значение ASCII A равно 65, а значение Z равно 90. Так, ((char)65) будет напечатано как A.
2 голосов
/ 01 апреля 2020

UUID

Вы можете использовать UUID значения для случайных строк.

Set<String> strings = IntStream.range(0, 5).boxed()
        .map(i -> UUID.randomUUID().toString())
        .collect(Collectors.toSet());

Вывод:

[174686cc-f1e6-4532-944f-de5a85fa5979, 0151b604-93fa-41cf-8ca8-e872c29e261f, 030c6524-c8cb-4c32-a17b-6189a3a167d5, 3e99e7fd-f143-4af6-bcfc-9b968e9397c9, 11099e22-3c05-45e6-b989-2a3c62acaa15]
1 голос
/ 01 апреля 2020

Алфавит

Решение с использованием алфавита:

String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int stringLength = 10;

Set<String> strings = IntStream.range(0, 5)
        .mapToObj(i -> IntStream.range(0, stringLength)
                .mapToObj(j -> Character.toString(alphabet.charAt(new Random().nextInt(alphabet.length()))))
                .collect(joining()))
        .collect(toSet());

Вывод:

[XBZPISNKHR, EBAGPRHQNX, GOCZEBGRFC, YRTQZFQNQJ, DVSUXWEITU]
1 голос
/ 01 апреля 2020

Вот одно решение (из многих возможностей). Обратите внимание, что это может быть сведено к нескольким утверждениям, но тогда это будет трудно объяснить комментариями. Во-первых, давайте сделаем самый простой.

        Random r = new Random(23);
        Set<String> stringSet = new HashSet<>();

        for (int i = 0; i < 5; i++) {
            stringSet.add(Integer.toString(r.nextInt()));
        }

        stringSet.forEach(System.out::println);

Да! Числа были преобразованы в строки. Вы не указали тип строк.

Двигаемся дальше ...

        Random r = new Random(23);
        Set<String> stringSet = new HashSet<>();

        for (int i = 0; i < 5; i++) {
            // use a Stringbuilder to build it.
            StringBuilder sb = new StringBuilder();
            // length of string between 6 and 10 inclusive
            int len = r.nextInt(5)+6; 

             // now build the string
             while (len-- > 0) {    
                // generate a character from 'a' to 'z' inclusive
                char c = (char)(r.nextInt(26) + 'a'); 
                sb.append(c);
            }

            // and it to the set
            stringSet.add(sb.toString());
        }

        // print them.
        for (String s : stringSet) {
            System.out.println(s);
        }


Этот прогон напечатан

sefmjkzket
qfjklm
dxocur
mldkzcmv
ivqrynsspu

Ваш вывод может быть другим (они random).

Обратите внимание, что при построении строки используются целые числа от 0 до 25 включительно. Поскольку строчные буквы являются последовательными, вы получаете a до z, просто добавляя a к каждому числу. Можно также просто случайным образом индексировать в строку букв, например, так:

String alphabet = "abcdefghijlmnopqrstuvwxyz";
index = r.random(26); //0 to 25
char c =alphabet.charAt(index);

Как было сказано, есть много способов сделать это.

Вот заключительная демонстрация с использованием Streams. Струны имеют различную природу.

        String alphabet = "abcdefghijlmnopqrstuvwxyz";
        Set<String> strings = Stream.generate(() -> 1)
                .map(z -> alphabet.substring(r.nextInt(5),
                        r.nextInt(10) + 10))
                .distinct().limit(5).collect(Collectors.toSet());


        strings.forEach(System.out::println);

Распечатать их

cdefghijl
abcdefghij
defghijlmnopqrs
cdefghij
cdefghijlmnopqrs

1 голос
/ 01 апреля 2020

В этом примере используются числовые значения символов Юникода для создания строки, класс Java .util.Random используется для случайного генерирования числа:

Код

public static void main(String args[]) {
    Set<String> randomStrings = new HashSet<>();//create the set
    Random random = new Random(); //this creates a random number

    for(int i=0;i<5;i++) { //loop 5 times
        String generatedString = random.ints(60, 122)//(min value, max value) 
                  .limit(10) //sets the string length to 10 characters
                  .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                  .toString();
        randomStrings.add(generatedString); //add the generatedString to the Set
    }

    //print contents of the Set
    for(String s: randomStrings) {
        System.out.println(s);
    }
}

Выход:

pflmmE[jCu
ogofehE<XS
BFbqtHnE_O
Qvu@IDJcI=
Al>BvaLZ@[
0 голосов
/ 01 апреля 2020

Я не знаю, почему вам нужно создавать случайные строки, но я не думаю, что это будет легко, хотя я никогда не пробовал. Также я не полностью знаю, что вы подразумеваете под множеством, но я думаю, что вы имеете в виду объединить строки, чтобы сделать предложение? Если это так, просто сделайте это.

String str = "blah ";
String str2 = "ughhh ";
String str3 = "pshh ";
String together = str + str2 + str3;
System.out.println(together);

output

blah ughhh pshh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...