Java字符串操作/新字符串创建

时间:2018-02-24 04:37:42

标签: java string

我正在创建一个程序,它将一个字符串变量带入我的方法,该字符串变量被复制到我创建的新字符串变量中。然后它接受我的新字符串变量并检查我的String中的任何元音。然后它接受元音并用replaceAll()方法将它们加倍。我目前只是想弄清楚如何将非元音加倍。因此,例如,"easy!!"的输出应为"eeaasssyyy!!!!!!

我正在寻找一种简单的方法 - 任何建议?我是编程的新手,字符串让我难过。

public class RepeactChars
{
   public static void main(String[] args)
   {
      System.out.println(repeatChars("easy!!"));
      System.out.println(repeatChars("abc"));
      System.out.println(repeatChars("apple"));
      System.out.println(repeatChars("Homework"));
      System.out.println(repeatChars("Spring"));
      System.out.println(repeatChars("Integer"));
   }

   public static String repeatChars(String x)
   {
      String str = x;
      str = str.replaceAll("a", "aa");
      str = str.replaceAll("e", "ee");
      str = str.replaceAll("i", "ii");
      str = str.replaceAll("o", "oo");
      str = str.replaceAll("u", "uu");

      return str;
   }
}

3 个答案:

答案 0 :(得分:3)

我会使用两个正则表达式;反向顺序一到三个辅音(一切都不是aeiou),一个加倍元音(aeiou)。像,

public static String repeatChars(String x) {
    return x.replaceAll("([aeiou])", "$1$1").replaceAll("([^aeiou])", "$1$1$1");
}

我得到了

eeaasssyyy!!!!!!
aabbbccc
aapppppplllee
HHHoommmeewwwoorrrkkk
SSSppprrriinnnggg
IIInnnttteegggeerrr

为了完整起见,您还可以使用StringBuilder来实现它,这是switch case存在的优雅解决方案(至少在我的位置)意见)。例如,

public static String repeatChars(String x) {
    StringBuilder sb = new StringBuilder();
    for (char ch : x.toCharArray()) {
        switch (ch) {
        case 'a': case 'e': case 'i': case 'o': case 'u':
            sb.append(ch).append(ch);
            break;
        default:
            sb.append(ch).append(ch).append(ch);
            break;
        }
    }
    return sb.toString();
}

输出相同的内容。

答案 1 :(得分:0)

您的方法效率不高,因为每个replaceAll调用都会遍历整个字符串。

基本方法是循环遍历字符串,对于每个字符,请问"它是元音。"如果是,加倍,否则三倍。

你应该真的使用StringBuilder课程,但在这个例子中我不会。

public static String repeatChars(String x)
{
    String newStr = "";
    for (int i = 0; i < x.length(); ++i) {
       char c = x.charAt(i);
       int repeatTimes = "aeiou".indexOf(x.charAt(i)) == -1 ? 3 : 2;
       for (int j = 0; j < repeatTimes; ++j) {
           newStr += c;
       }
    }

  return newStr;
}

它有点罗嗦,但它比使用正则表达式更有效。

答案 2 :(得分:0)

您的解决方案的固有问题是您必须列出要使用的每个字符。解决这个问题的方法是遍历每个char并生成一个新字符串:

static String change(String in){
    String out = "";
    for(int i = 0; i < in.length(); i++){
        char letter = in.charAt(i);
        out += repeat(isVowel(letter)?3:2, letter);
    }
    return out;
}
static boolean isVowel(char c){
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
public static String repeat(int count, char with) {
    return new String(new char[count]).replace("\0", ""+with);
}