Создать новую строку с несколькими случайными новыми строками

У меня есть строка:

String text = "Nothing right in my brain. Nothing left in my brain"

Я хочу создать новую строку text2 которая имеет 2-4 случайных новых строки из предыдущего, таких как:

"Nothing \n right \n in my brain.  \n Nothing left in my brain"

или же

"Nothing right in \n my brain. Nothing left in \n my brain"

Как создать новую строку со случайной новой строкой между словами? Я думаю, чтобы получить индекс пробела, чтобы вставить новую строку после случайного пробела. Но я продолжаю получать только первый пробельный индекс. Кто-нибудь знает лучший подход для решения этой проблемы? Спасибо.

6 ответов

Ваша задача состоит из трех этапов: разбить строку, вставить случайность и использовать их вместе...

Расщепление строки

Разбейте его на слова с помощью String.split(), который создает массив строк (в данном случае слова) через пробелы.

  String[] words = text.split(" "); //Split by spaces

затем перестройте строку с добавлением новых строк, например:-

 StringBuiler sb = new StringBuilder();
 for (String word : words)
 {
   sb.append(word + "\n");
 }
 String text2 = sb.toString();

В этом случае вы вставите новую строку между каждым словом и сохраните результат в text2,

Вставка случайности

Вы можете просто создать объект Random...

    Random random = new Random(); 

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

//Randomly add or don't add a newline (Compacted with a ternary operator instead of an 'if')
sb.append(word + (random.nextBoolean() ? "\n" : ""));

Объединяя это (TLDR)

Тогда все, что вам нужно сделать, это сохранить количество вставленных новых строк и ограничить их до этого. Таким образом, ваш код становится:-

 int requiredNewlines = random.nextInt(2 - 5) + 2; //Number between 2-4
 for (String word : words) //For each word
 {
   sb.append(word); //Add it
   if (requiredNewlines >= 0 && random.nextBoolean()) 
   {
   //Randomly add newline if we haven't used too many
      sb.append("\n"); 
      requiredNewlines--;
   }
 }
 String text2 = sbAppen.toString();

Дополнительно

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

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

Сначала вам нужен новый случай из 2-4:

int max = 4;
int min = 2;

Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;

После разбиения строки на слова:

String[] words = text.split(" ");

Затем получите 4 разных номера от 1 в words.length

ArrayList<Integer> randomPositions = new ArrayList<Integer>(randomNum);
max = words.length;
min = 1;
for (int count = 0; count < randomNum; count ++) {
   int random = rand.nextInt((max - min) + 1) + min;
   if (randomPositions.contains(random)) count --;
   else randomPositions.add(random);
}

Наконец положить \n в позициях при перестройке массива:

StringBuilder result = new StringBuilder();
for (int count = 0; count < max; count ++) {
    result.append(words[count]);
    if (randomPositions.contains(count))
        result.append("\n");
    else
        result.append(" ");
}

Проверьте это рабочее демо

Output1:

Nothing right in my
brain. Nothing
left in my brain 

Выход2:

Nothing right
in my brain. Nothing left
in my
brain 

output3:

Nothing right in my brain. Nothing left
in my brain 

Генерация строки со вставками в разных позициях:

public static String generateString(String inputString, String delimiter,
        String insString, int[] insIndexes) {

    String[] splittedString = inputString.split(delimiter);

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < splittedString.length; i++) {

        sb.append(splittedString[i]);

        if (Arrays.binarySearch(insIndexes, i + 1) >= 0)
            sb.append(delimiter + insString);

        sb.append(delimiter);
    }

    return sb.toString();
}

Часть вызова:

    String inputString = "Nothing right in my brain. Nothing left in my brain";
    String delimiter = " "; // input String delimiter

    String insString = "\n"; // insertion String
    int[] insIndexes = { 2, 4, 6, 8 }; // insertion indexes

    String outputString = generateString(inputString, delimiter, insString, insIndexes);

Вы можете получить только первый индекс, используя indexOf() или последний индекс, использующий lastIndexOf() методы.

Но в качестве обходного пути вы можете использовать text.indexOf(" ", randomInt);, Это даст вам первый индекс " " после индекса randomInt.

Сначала вы можете получить случайный индекс, где поставить новую строку

Random rand = new Random();
String[] words = text.split(' '); 

for(int i = 0; i < 3; i++){
    int index = rand.nextInt(words.length());
    words[index] =  "\n" + words[index];
}

text = Arrays.toString(words);

и в конце у вас будет 3 новые строки в случайных местах в вашем text строка

РЕДАКТИРОВАТЬ: один из способов получить без запятых это:

text = Arrays.toString(words).replaceAll(", ", " ");
String str = "Nothing right in my brain. Nothing left in my brain";
String[] split = str.split(" ");
for (int i = 0; i < split.length; i++) {
    int flag = ((int) (Math.random() * 10)) % 2;

    if (flag == 0) {
        split[i] = split[i] + "\n";
    }
}
str="";
for (int i = 0; i < split.length; i++) {
    str += split[i]+" ";
}
Другие вопросы по тегам