【问题标题】:A series of String Manipulation Operations with counter in JavaJava中带计数器的一系列字符串操作操作
【发布时间】:2021-09-12 13:39:11
【问题描述】:

问题:

下面的字符串包含多个单词,每个单词用 hash(#) 分隔。 用#分割每个单词后,

  1. 反转单词中的每个字符。
  2. 为每个单词启动计数器形式 1。
  3. 找到字符 a,e,i,o,u,如果找到该字符,则将其替换为计数器值并递增到 1。
  4. 为每个单词重置计数器。
  5. 打印最后的字符串。 在末尾打印字符串。 示例:

输入:my#name#is#manan 输出:ym 1m2n s1 n1n2m

我的代码是:

import java.lang.*;
import java.io.*;
import java.util.*;

class StrSplit {
    public static void main(String[] args) {
        String sentence = "my#name#is#manan";
        String[] word = sentence.split("#");
        String[] reverseword = new String[word.length];

        for (int i = 0; i < word.length; i++) {
            StringBuilder revword = new StringBuilder(word[i]);     // METHOD FOR USING .reverse()
            revword.reverse();      // REVERSING

            reverseword[i] = revword.toString();        // SAVING REVERSED WORDS INTO AN ARRAY.
        }

        for (int i = 0; i < reverseword.length; i++) {
            int counter = 1;
            String current = reverseword[i];        //SELECTING A WORD

            for (int j = 0; j < current.length(); j++) {
                char ch = current.charAt(j);        //SELECTING A CHARACTER 

                char count=(char)(counter+ '0');     //VOWEL COUNTER

                if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
                    current = current.replace(current.charAt(j),count);     //REPLACE VOWEL WITH NUMBER
                    counter++; 
                }
            }           
            counter=1;   
            
            StringBuilder output= new StringBuilder(current);
            output.append(' ');
            System.out.print(output);
        }
    }
}

但是我的输出中有一个错误。我的输出是:

ym 1m2n s1 n1n1m 

虽然它应该是:

ym 1m2n s1 n1n2m 

问题是,如果元音不相同,计数器只会增加。

【问题讨论】:

    标签: java arrays string counter


    【解决方案1】:

    reverseword 设为StringBuilder 的数组,并使用java.lang.StringBuilder 类的方法replace。您还可以使用更少的变量和更少的操作。

    String sentence = "my#name#is#manan";
    String[] word = sentence.split("#");
    StringBuilder[] reverseword = new StringBuilder[word.length];
    for (int i = 0; i < word.length; i++) {
        reverseword[i] = new StringBuilder(word[i]); // METHOD FOR USING .reverse()
        reverseword[i].reverse(); // REVERSING
    }
    for (int i = 0; i < reverseword.length; i++) {
        int counter = 1;
        for (int j = 0; j < reverseword[i].length(); j++) {
            char ch = reverseword[i].charAt(j); // SELECTING A CHARACTER
            String count = String.valueOf(counter); // VOWEL COUNTER
            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
                reverseword[i].replace(j, j + 1, count); // REPLACE VOWEL WITH NUMBER
                counter++;
            }
        }
    //    counter = 1; <- not required
    
        StringBuilder output = new StringBuilder(reverseword[i]);
        output.append(' ');
        System.out.print(output);
    }
    

    运行上面的代码会产生以下输出:

    ym 1m2n s1 n1n2m
    

    【讨论】:

      【解决方案2】:

      current.replace(current.charAt(j),count) 替换了所有出现的current.charAt(j),因此如果多次出现同一个元音,您可以在一次调用中替换它的所有出现,并且只增加一次计数器。

      如果你改变了,你可以只替换第一个匹配项

      current = current.replace(current.charAt(j),count); 
      

      current = current.replaceFirst(current.substring(j,j+1),Integer.toString(counter));
      

      这样,每替换一个字符,计数器就会增加一次。

      现在的输出是:

      ym 1m2n s1 n1n2m
      

      请注意,replaceFirst() 需要 String 参数,而不是 char

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 2015-03-08
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2020-09-04
        • 1970-01-01
        相关资源
        最近更新 更多