创建一个包含多个随机换行符的新字符串。

5

我有一个字符串:

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个回答

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

汇总(简短版)

然后,您只需要维护插入的换行符计数并将其限制在该计数内。因此,您的代码变为:

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


2
我不是投票者,但你不应该再使用StringTokenizer类了。改用 String.split 代替。 - Tom
1
据我所知,StringTokenizer 的性能比 split 更好。 - xrisk
1
我一直更喜欢Tokenizer,但是你说得对Tom。已更改。 - Ross Drew
1
如果我们没有使用太多的换行符,随机添加换行符是可以的...好吧...但这种随机化并不是均等分布的...第一个位置比最后一个位置更有可能出现\n - Jordi Castilla
在我看来,@Tom,“更好”在这里是有争议的。StringTokenizer不支持正则表达式,因此被弃用,但在这种情况下,使用它是完全合理的。我认为在这种情况下应该考虑性能更重要。 - xrisk
显示剩余6条评论

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

检查 这个工作演示

输出1:

Nothing right in my
brain. Nothing
left in my brain 

Output2:
Nothing right
in my brain. Nothing left
in my
brain 

输出3:

Nothing right in my brain. Nothing left
in my brain 

谢谢您的回答。我尝试了您的解决方案,但是每个字符都被输入了,就像: N o t h i n g r i g h t这是怎么回事?无论如何,使用那个Array List有什么用处? - Lynx
1
ArrayList 是一个 List,它具有检查内部值的可能性... 你也可以创建一个整数数组 int[] positions 并使用内部循环检查数组是否包含,或者通过 Arrays.asList(positions).contains(count) 进行即时转换,但这将会消耗更多的 CPU。 - Jordi Castilla
这个比之前的更好。注意,如果你想插入2-4行新行,则随机数应该在1-3之间。因为换行符从0、1、2、3位置开始计数...它怎么可能消耗更多的CPU呢?另外,你知道如何防止在句子末尾添加新行吗?因为有时它会在最后一个单词后面添加新行,我只想要“单词之间”的新行。 - Lynx

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

谢谢您的回答。这个程序可以生成新行,但是结果变成了: [Nothing, right, in, my..... ] 可能是因为它被打印成数组了... 有没有办法让它成为一个带有多行的句子?(不用逗号) - Lynx
哦,是的,你说得对,我没明白。试试我的修改吧。我认为它会得到你需要的结果 :) - Gabriella Angelova

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

在不同位置生成带插入的字符串:

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

0

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

但是,作为一种解决方法,你可以使用 text.indexOf(" ", randomInt);。这将在随机索引之后给你第一个 " " 的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接