/ / Criar nova string com várias novas linhas aleatórias - java, string, random

Criar nova string com vários nova linha aleatória - java, string, random

Eu tenho uma string:

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

Eu quero criar um Novo corda text2 que tenha 2-4 nova linha aleatória da anterior, como:

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

ou

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

Como criar uma nova string com nova linha aleatóriaentre as palavras? Estou pensando em obter o índice de espaço em branco, a fim de inserir uma nova linha após o espaço em branco aleatório. Mas continuo recebendo o primeiro índice de espaço em branco. Alguém sabe melhor abordagem para resolver isso? Obrigado.

Respostas:

5 para resposta № 1

Existem três estágios para o seu problema, dividindo o Corda, inserindo aleatoriedade e usá-las juntas ...

Dividindo um Corda

Divida em palavras com String.split (), que cria uma matriz de Strings (neste caso, palavras) por espaços.

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

então reconstrua seu Corda com novas linhas adicionadas, por exemplo: -

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

Nesse caso, você inserirá uma nova linha entre cada palavra e salvará o resultado em text2.

Inserindo aleatoriedade

Você poderia apenas criar um Aleatória objeto...

    Random random = new Random();

Em seguida, use-o no código que insere sua nova linha, assim ...

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

Reunindo (TLDR)

Então, tudo que você precisa fazer é manter uma contagem de novas linhas inseridas e limitá-las a isso. Portanto, seu código se torna: -

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

Além disso

Embora a aleatoriedade neste exemplo se ajuste ao seuO objetivo aqui não é a implementação ideal de aleatório (como mencionado nos comentários), na medida em que há mais viés em direção a um que pareça mais próximo do início do Corda do que o fim e que não há chance de aparecer antes da primeira palavra.

Há também outra opção de usar StringTokenizer ao invés de String.split () que eu prefiro muito, mas não lida com regex e está ficando fora de uso, por isso mudei minha resposta para usar String.split ()


1 para resposta № 2

Primeiro você precisa de um novo aleatório de 2-4:

int max = 4;
int min = 2;

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

Após dividir a sequência em palavras:

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

Em seguida, obtenha 4 números diferentes de 1 para 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);
}

Finalmente colocar n nas posições ao reconstruir a matriz:

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(" ");
}

Verifica esta demonstração de trabalho

Saída1:

Nothing right in my
brain. Nothing
left in my brain

Saída2:

Nothing right
in my brain. Nothing left
in my
brain

Saída3:

Nothing right in my brain. Nothing left
in my brain

0 para resposta № 3

Você pode obter apenas o primeiro índice usando indexOf() ou o último índice usando lastIndexOf() métodos.

Mas, como solução alternativa, você pode usar text.indexOf(" ", randomInt);. Isso fornecerá o primeiro índice de "" após o índice randomInt.


0 para a resposta № 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 para a resposta № 5

Primeiro você pode obter um índice aleatório onde colocar a nova linha

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

e no final você terá 3 novas linhas em lugares aleatórios no seu text corda

EDIT: uma maneira de o resultado ficar sem vírgulas é esta:

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

0 para a resposta № 6

Gere String com inserções em diferentes posições:

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

Peça de Invocação:

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