package loopPractice;
import java.util.Scanner;
public class replaceVowels {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
System.out.print("Enter a string: ");
String s = sc.nextLine();
String originalString = s;
char[] vowels = {'a', 'e', 'i', 'o', 'u'};
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c.equals(vowels[i])){
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
System.out.println(originalString);
System.out.println(s);
}
}
工作是替换单词中的所有元音,如何使用元音数组替换每个元音?
问题是:编写一个返回String的方法,该String是String参数的副本,但没有任何元音
答案 0 :(得分:2)
那么,根据你的问题的精神,你可以编写一个新函数来检查一个数组是否包含一个字符:
public static void main(String[] args) {
System.out.print("Enter a string: ");
String s = sc.nextLine();
String originalString = s;
char[] vowels = {'a', 'e', 'i', 'o', 'u'};
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (contains(c, vowels)) {
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
System.out.println(originalString);
System.out.println(s);
}
private static boolean contains(char c, char[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == c) {
return true;
}
}
return false;
}
答案 1 :(得分:1)
此代码存在三个大问题。
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c.equals(vowels[i])){
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
首先,您无法在equals
上使用char
,因为char
是基本类型。使用==
。
其次,你没有正确检查元音。上面的代码比较了's'的第0个字符和元音数组中的第0个字符;也就是说,它将它与'a'
进行比较,但不与任何其他元音进行比较。类似地,它将索引1处的字符与'e'
进行比较,但不将任何其他元音,字符2作为'i'
等进行比较;当你到达索引5时,程序将抛出异常,因为vowels
不是那么大。
解决方案是你需要一个双循环(或嵌套循环)。对于s
中的每个字符,您需要针对 vowels
数组中的每个字符进行检查(或者至少在您匹配之前)。所以你需要像
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean isAVowel = false;
for (int j = 0; j < vowels.length; j++) {
if (c == vowels[j]) {
isAVowel = true;
break; // will leave the inner loop but not the outer loop
}
// I'll let you finish the rest
正如@cptcactus在他的回答中所说,将内循环移动到新方法是实现这种解决方案的好方法。
第三个问题更微妙。当您循环遍历数组或字符串中的索引,并且循环从数组或字符串中删除元素时,您必须非常小心,因为索引将会移位。假设您的代码大致如此:
for (int i = 0; i < s.length(); i++) {
if [[[ s.charAt(i) is a vowel ]]] {
[[[ remove the i'th character from s; ]]]
}
}
说s
是"air"
。首先i
设置为0,s.charAt(i)
设置为'a'
。这是一个元音,所以我们删除它。这意味着s
现在是"ir"
。然后我们循环回来并将i
设置为1.现在s.charAt(i)
是'r'
,因为它使用s
的新值,它从不查看元音{{1} }。
解决该问题的几种方法是:
如果您从中移除某个字符,请确保'i'
不会增加(您可以使用i
取消i--
};
向后搜索索引(即以i++
开头并递减)而不是转发。
(通过使用s.length()-1
方法或replaceAll
,还有其他方法可以解决这个问题,但我假设这是一个类,你的目的是学习循环的基础知识和这样。)
答案 2 :(得分:0)
String.replaceAll("[aeiou](?!\\b)", "");
读取:匹配所有未被跟随的元音([aeiou])((?!...))和#34;字尾#34; (\ b)中。有关更多信息,请阅读java.util.regex.Pattern;
更简单的是这个(相当但更简单)正则表达式:
String.replaceAll("[aeiou]\\B", "");