/ / Създаване на нов низ с няколко произволни нови линии - java, string, random

Създаване на нов стринг с няколко случаен нов ред - java, string, random

Имам низ:

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

Искам да създам a нов низ 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"

Как да създадете нов низ с произволна нова линиямежду думите? Мисля да получа индекс на празно пространство, за да вмъкна нов ред след случайно празно пространство. Но продължавам да получавам само първия индекс на интервалите. Някой знае ли по-добър подход за решаване на това? Благодаря ти.

Отговори:

5 за отговор № 1

Има три етапа на вашия проблем, разделяне на низ, вмъкване на случайност и използването им заедно ...

Разделяне a низ

Счупете го с думи String.split (), която създава масив от Strings (в този случай думи) с интервали.

  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 = 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 () което много предпочитам, но не се занимава с regex и излиза от употреба, така че промених отговора си String.split ()


1 за отговор № 2

Първо се нуждаете от ново произволно от 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

Output2:

Nothing right
in my brain. Nothing left
in my
brain

Output3:

Nothing right in my brain. Nothing left
in my brain

0 за отговор № 3

Можете да използвате само първия индекс indexOf() или последния индекс, използващ lastIndexOf() методи.

Но като заобиколно решение можете да използвате text.indexOf(" ", randomInt);, Това ще ви даде първия индекс на "" след индекса randomInt.


0 за отговор № 4
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]+" ";
}

0 за отговор № 5

Първо можете да получите произволен индекс, където да поставите новата линия

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 низ

EDIT: един от начините да бъде без запетаи е този:

text = Arrays.toString(words).replaceAll(", ", " ");

0 за отговор № 6

Генериране на низ с вмъквания на различни позиции:

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);