使用多个随机换行创建新字符串

时间:2015-06-26 11:14:40

标签: java string random

我有一个字符串:

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 个答案:

答案 0 :(得分:5)

你的问题有三个阶段,分割String,插入随机性并一起使用......

拆分String

将其分为String.split()的单词,用空格创建一个字符串数组(在本例中为单词)。

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

然后使用添加的换行重建您的String: -

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

<强>另外

虽然这个例子中的随机性符合你的目的,但它并不是随机的理想实现(如评论中所提到的),因为对String的起点更接近于StringTokenizer的偏见比结束,并且没有机会出现在第一个单词之前。

还有另一个使用String.split()代替String.split()的选项,我更喜欢它,但它不会处理正则表达式并且不再使用,所以我已经改变了我使用Ruby#inject

的答案

答案 1 :(得分:1)

首先你需要一个2-4的新随机:

int max = 4;
int min = 2;

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

将字符串拆分为单词后:

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

然后,从1words.length

获取4个不同的数字
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(" ");
}

检查this working demo

输出1:

Nothing right in my
brain. Nothing
left in my brain 

输出2:

Nothing right
in my brain. Nothing left
in my
brain 

输出3:

Nothing right in my brain. Nothing left
in my brain 

答案 2 :(得分:0)

您只能使用indexOf()获取第一个索引,或使用lastIndexOf()方法获取最后一个索引。

但作为解决方法,您可以使用text.indexOf(" ", randomInt);。这将为您提供randomInt索引之后的第一个“”索引。

答案 3 :(得分:0)

首先,您可以获得一个随机索引放置新行的位置

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

最后,您的text字符串

中的随机位置将有3个新行

编辑:没有逗号的结果就是这一个:

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

答案 4 :(得分: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]+" ";
}

答案 5 :(得分:0)

生成包含不同位置插入的字符串:

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