【问题标题】:Create New String with Several Random New Line使用多个随机新行创建新字符串
【发布时间】:2015-09-13 07:48:06
【问题描述】:

我有一个字符串:

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

我想创建一个 new 字符串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"

如何在单词之间创建一个带有随机换行的新字符串? 我正在考虑获取空格的索引,以便在随机空格之后插入新行。但我只不断得到第一个空白索引。 有谁知道更好的方法来解决这个问题?谢谢。

【问题讨论】:

    标签: java string random


    【解决方案1】:

    您的问题分为三个阶段,拆分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();
    

    另外

    虽然此示例中的随机性符合您的目的,但它不是随机的理想实现(如 cmets 中所述),因为出现更接近 String 开头而不是结尾和它不可能出现在第一个单词之前。

    还有另一种选择使用StringTokenizer 而不是String.split(),我更喜欢它,但它不处理正则表达式并且不再使用,所以我改变了我的答案以使用String.split()

    【讨论】:

    • 我不是选民,但你不应该再使用StringTokenizer 类了。请改用String.split
    • @Tom AFAIK 在StringTokenizer 上的表现优于split
    • 我一直更喜欢 Tokenizer 但你说得对,Tom。改变了。
    • 如果我们没有使用太多,随机添加换行符...好的...但是这个随机化不是均匀分布的...第一个位置有更多比上次拥有\n....
    【解决方案2】:

    首先你需要一个 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 
    

    【讨论】:

    • 谢谢你的回答。我做了你的解决方案。但是每个字符都输入了.. 比如:N o t h i n g r i g h t 怎么来的?无论如何..使用该数组列表有什么用?
    • ArrayList 是一个List 并且它可以检查里面的值...您还可以创建一个整数数组int[] positions 并检查该数组是否包含使用inner for循环或转换即时Arrays.asList(positions).contains(count),但它会花费更多的CPU
    • 这个比以前更好.. 注意,如果你想插入 2-4 个新行,那么随机数应该在 1-3 之间。因为换行符从 0,1,2,3 位置开始计算......它怎么会花费更多的 CPU?另外,你知道如何防止在句尾添加新行吗?因为有时它会在最后一个单词之后添加新行,我只想要“单词之间”的新行..
    【解决方案3】:

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

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

    【讨论】:

      【解决方案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]+" ";
      }
      

      【讨论】:

        【解决方案5】:

        首先你可以得到一个随机索引来放置新行

        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.....] 可能是因为它被打印为数组...有什么方法可以使它成为有几个的句子线? (不带逗号)
        • 是的,你说得对,我没听懂。试试我的编辑。我认为这会导致您需要:)
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-30
          • 1970-01-01
          • 1970-01-01
          • 2010-10-25
          • 1970-01-01
          相关资源
          最近更新 更多