Java字符串操作/新字符串创建
我目前正在创建一个程序,该程序将一个字符串变量引入我的方法,该字符串变量被复制到我创建的一个新字符串变量中。然后它接受我的新字符串变量并检查字符串中的任何元音。然后它使用我的Java字符串操作/新字符串创建,java,string,Java,String,我目前正在创建一个程序,该程序将一个字符串变量引入我的方法,该字符串变量被复制到我创建的一个新字符串变量中。然后它接受我的新字符串变量并检查字符串中的任何元音。然后它使用我的replaceAll()方法将元音加倍。我目前一直在琢磨如何将非元音字母增加三倍。例如,“easy!!”的输出应该是“eeaassyyy!!!!!!! 我正在寻找一种简单的方法来实现这一点——有什么建议吗?我是编程新手,字符串让我感到困惑 public class RepeactChars { public stati
replaceAll()
方法将元音加倍。我目前一直在琢磨如何将非元音字母增加三倍。例如,“easy!!”
的输出应该是“eeaassyyy!!!!!!!
我正在寻找一种简单的方法来实现这一点——有什么建议吗?我是编程新手,字符串让我感到困惑
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;
}
}
我会使用两个正则表达式;一个是以相反的顺序将辅音(不是所有的aeiou
)增加三倍,另一个是将元音(aeiou
)增加两倍
我得到
eeaasssyyy!!!!!!
aabbbccc
aapppppplllee
HHHoommmeewwwoorrrkkk
SSSppprrriinnnggg
IIInnnttteegggeerrr
为了完整性起见,您还可以使用StringBuilder
实现它,这是一个存在开关
案例
的优雅解决方案的地方(至少在我看来)。例如
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();
}
输出相同。您的方法不是特别有效,因为每个
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;
}
公共静态字符串重复字符(字符串x)
{
字符串newStr=“”;
对于(int i=0;i
这有点冗长,但比使用正则表达式更有效。解决方案的固有问题是必须列出要使用的每个字符。解决方法是循环每个字符并生成一个新字符串:
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);
}
静态字符串更改(字符串输入){
串出“”;
对于(int i=0;i
@Elliot Frisch我喜欢你使用的正则表达式解决方案,你能给我解释一下这个解决方案吗。我注意到的大写元音出现了三次而不是两次。@hotrod28什么部分需要更多解释?([aeiou])
围绕元音创建一个组。“$1$1“
表示从该组中提取任何匹配项,并输出两次。第二个replaceAll
也一样,只从与元音不匹配的任何内容开始,然后将其三倍于“$1$1$1”。将AEIOU添加到两个模式中以处理大写字母。您的代码只使用小写字母,所以我认为这就是您所关心的。@ElliottFrisch感谢您的快速回复,我正在查看java文档,无法找到您为什么使用$1$1$1。您能解释一下这些特殊字符的实际含义吗?我想使用像([aeiou]){3}这样的语句是可行的,但事实并非如此。()创建一个组。第一组是1美元。您的语法要求匹配三个元音。可读性和简洁性通常比在非性能关键代码中效率的无限小提高更可取。不过,与正则表达式方法相比,这是一个不错的选择!如果要优化性能,请小心这样的循环中的字符串连接。Java每次都会为其实例化(然后丢弃)一个StringBuilder
实例。不要使用字符串连接,而是在循环外部声明自己的StringBuilder
实例并附加到该实例中。@nbrooks同意。
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);
}