我有一个字符串:
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"
如何在单词之间创建一个随机换行的新字符串? 我想获取空白的索引,以便在随机空格后插入新行。但我只是继续得到第一个空白索引。 有人知道更好的解决方法吗?谢谢。
答案 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(" ");
然后,从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(" ");
}
输出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
字符串
编辑:没有逗号的结果就是这一个:
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);