2015-06-26 3 views
5

ho una stringa:Crea nuova stringa con Diversi a caso la New Line

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

Voglio creare una stringa text2 che ha 2-4 casuale nuova linea dal precedente nuova, come ad esempio:

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

o

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

Come creare un nuova stringa con una nuova riga casuale tra le parole? Sto pensando di ottenere l'indice degli spazi bianchi, al fine di inserire una nuova riga dopo uno spazio casuale casuale. Ma continuo a ricevere il primo indice di spazi bianchi. Qualcuno conosce un approccio migliore per risolvere questo? Grazie.

risposta

5

Ci sono tre fasi per il vostro problema, dividendo la String, inserendo casualità e che li utilizzano insieme ...

Divisione di un String

Pausa in parole con String.split(), che crea una serie di Stringhe (in questo caso parole) per spazi.

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

quindi rigenerare la vostra String con a capo aggiunto per esempio: -

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

In questo caso sarà inserire un ritorno a capo tra ogni parola e salvare il risultato in text2.

Inserimento Casualità

Si potrebbe semplicemente creare un oggetto Random ...

Random random = new Random(); 

Quindi utilizzare nel codice che inserisce il vostro ritorno a capo, in questo modo ...

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

Unendo insieme (TLDR)

Quindi tutto ciò che devi fare è mantenere un conteggio delle newline inserite e limitarle a quello. Così il codice diventa: -

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

Inoltre

Anche se la casualità in questo esempio si inserisce il vostro scopo qui non è l'implementazione ideale di casuale (come accennato nei commenti), in quanto v'è più pregiudizi verso uno che appare più vicino all'inizio della String rispetto alla fine e che non c'è possibilità che appaia prima della prima parola.

C'è anche un'altra opzione di usare StringTokenizer invece di String.split() che preferisco di gran lunga, ma non si tratta di espressioni regolari e sta cadendo fuori uso, così ho cambiato la mia risposta a utilizzare String.split()

+0

misteriosi, inspiegabili giù voti di nuovo? :/ –

+2

Non sono l'elettore, ma non dovresti usare più la classe 'StringTokenizer'. Usa invece 'String.split'. – Tom

+1

@Tom Le prestazioni AFAIK su 'StringTokenizer' sono migliori di' split' – Rishav

0

Puoi ottieni solo il primo indice usando indexOf() o l'ultimo indice usando i metodi lastIndexOf().

Ma come soluzione alternativa è possibile utilizzare text.indexOf(" ", randomInt);. Questo ti darà il primo indice di "" dopo l'indice randomInt.

1

In primo luogo è necessario un nuovo caso da 2-4:

int max = 4; 
int min = 2; 

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

Dopo stringa divisa in parole:

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

Poi, prendi 4 numeri diversi da 1 al 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); 
} 

Infine inserire \n in posizioni durante la ricostruzione dell'arr ay:

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

check this working demo

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

Grazie per aver risposto .. Ho fatto la tua soluzione. ma ogni caratteri vengono immessi .. come: N o t h i n g r i g h t come mai? comunque ... a cosa serve usare quella lista di array? – Lynx

+0

@Lynx verifica il mio aggiornamento ... –

+1

'ArrayList' è un' Elenco' e ha la possibilità di controllare i valori all'interno ... puoi anche creare un array di interi 'int [] posizioni' e controllare se la matrice contiene usando un inner per loop o convertendo * al volo * con: 'Arrays.asList (posizioni) .contains (count)' ma costerà molto più CPU –

0

In primo luogo si potrebbe ottenere un indice casuale dove mettere la nuova linea

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 alla fine si avrà 3 nuove linee in luoghi casuali nella stringa di text

EDIT: un modo il risultato essere senza virgole è questo:

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

Grazie per aver risposto. Questo può generare nuova linea, ma comunque il risultato diventa: [Niente, giusto, in, mio ​​.....] forse è perché è stampato come array ... c'è qualche modo per farlo diventare frase con più righe? (senza virgole) – Lynx

+0

o sì, hai ragione, non l'ho capito. Prova con la mia modifica. Penso che risulterebbe in quello che ti serve :) –

0
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

Genera stringa con inserti in posizioni diverse:

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

Invocazione Parte:

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