【问题标题】:manipulating strings in java在java中操作字符串
【发布时间】:2018-10-26 01:12:37
【问题描述】:

您好,我在 java 中处理字符串时遇到了麻烦。我的问题是搜索一个字符串,当找到一个元音时,我想在该位置插入另一个字符串。这是我所拥有的:

Scanner scan = new Scanner(input.getText());

    while(scan.hasNext()){
        String str = scan.next();
        str = str.toUpperCase();
        String str1 = "";

        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
                    || str.charAt(i) =='I' || str.charAt(i) == 'O'
                    || str.charAt(i) == 'U'){

                    str1 = str.substring(0 , i) + "AHHH" + str.substring(i);

            }
        }

        System.out.print(str1);
    }

所以如果扫描仪读取的字符串是 hello 它应该返回:

HAHHHELLAHHHO

我的程序正在返回:

HAHHHELLOHELLAHHHO

所以我的程序是找到第一个元音加上 AHHH,然后将它与字符串的其余部分连接起来。然后它找到下一个元音并做同样的事情。

任何人都知道我可以如何更好地操作这个字符串,或者仅使用一个字符串就可以做到这一点?

【问题讨论】:

    标签: java string


    【解决方案1】:

    我会更喜欢StringBuilder,进一步我会更喜欢String.toUpperCase()String.toCharArray()for-each 循环。例如,

    String str = "hello";
    StringBuilder sb = new StringBuilder();
    for (char ch : str.toUpperCase().toCharArray()) {
        if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
            sb.append("AHHH");
        }
        sb.append(ch);
    }
    System.out.println(sb);
    

    输出(按要求)

    HAHHHELLAHHHO
    

    另一种选择,使用正则表达式对元音进行分组,并将它们替换为“AHHH”和组。喜欢,

    System.out.println(str.toUpperCase().replaceAll("([AEIOU])", "AHHH$1"));
    

    【讨论】:

      【解决方案2】:

      你的问题在这里:

      str1 = str.substring(0 , i) + "AHHH" + str.substring(i);
      //                   ^
      

      每次找到元音时,都会在原始字符串的开头再次附加一个子字符串。

      其次,在循环中连接字符串效率低下,最好使用StringBuilder


      把所有东西放在一起:

      import java.util.*;
      
      public class Test {
        public static void main(String[] args) {
          String str = "hello";
          StringBuilder sb = new StringBuilder();
      
          for (char c : str.toUpperCase().toCharArray()) {
            if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
              sb.append("AHHH");
            }
      
            sb.append(c);
          }   
      
          System.out.print(sb.toString());
        }
      }
      

      或者,您可以将replaceAll() 与正则表达式一起使用:

      public class Test {
        public static void main(String[] args) {
          String str = "hello";
          String result = str.toUpperCase().replaceAll("([AEIOU])", "AHHH$1");
      
          System.out.println(result);
        }
      }
      

      【讨论】:

        【解决方案3】:

        将你的 for 循环更改为:-

        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
                    || str.charAt(i) == 'I' || str.charAt(i) == 'O'
                    || str.charAt(i) == 'U') {
                str1 += "AHHH";
            }
            str1 += str.charAt(i);
        }
        

        这是完整的工作示例:-

        public static void main(String[] args) {
            String str = "hello".toUpperCase();
            String str1 = "";
        
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == 'A' || str.charAt(i) == 'E'
                        || str.charAt(i) == 'I' || str.charAt(i) == 'O'
                        || str.charAt(i) == 'U') {
                    str1 += "AHHH";
                }
                str1 += str.charAt(i);
            }
            System.out.print(str1);
        }
        

        最好在循环中使用StringBuilder

        【讨论】:

          【解决方案4】:

          每次循环找到元音时,它都会再次连接 HELLO。所以当它击中 E 时 str1 看起来像“HAHHHELLO”,但一旦击中 O,它就会再次添加 HELLO,因为您使用的是原始字符串的子字符串。

          【讨论】:

            猜你喜欢
            • 2015-03-08
            • 2014-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多