如何在单个元音前插入一个音节
How to insert a syllable before a single vowel
我尝试在每个元音前插入一个音节,但有以下限制:
- 在每个 之后的元音 (a, e, i, o, u) 之前, 插入 杂音音节 "av".
- 除非元音前面有另一个元音
其实我已经做到了
public static String translate(String text) {
char [] charArray = text.toCharArray();
StringBuilder sb = new StringBuilder();
for(char c : charArray) {
if (charArray.length < 255){
if (isVowel(c)) {
sb.append(String.format("av%s" , c));
}
else {
sb.append(c);
}
}
}
return sb.toString();
}
static boolean isVowel(char c) {
return (c == 'a') || (c == 'e') ||
(c == 'i') || (c == 'o') ||
(c == 'u');
}
对于没有双元音的单词,它完美地工作:
猫变成了
Cavat
但是双元音不起作用
遇见就变成
Maveavet // Should return Meet
如何检查连续的 2 个字母是否为元音字母,如果是,则不添加音节?
提前致谢
一种方法是自己管理索引,而不是使用增强的 for 循环。这允许您通过检查下一个字符是否存在来 'skip' 超过两个元音块。这样的事情应该有效:
int i = 0;
while (i < charArray.length) {
char c = charArray[i];
if (isVowel(c)) {
if (i + i == charArray.length || isVowel(charArray[i+1])) {
sb.append("av");
} else {
i++;
}
}
sb.append(c);
i++;
}
请注意,当存在三个连续元音时,这无法解决。
这是一个使用普通 for 循环的版本:
public static String translate(String text) {
char [] charArray = text.toCharArray();
StringBuilder sb = new StringBuilder();
Set<Character> vowels = new HashSet<>(Arrays.asList('a','e','i','o','u'));
char cFirst = charArray[0];
if (vowels.contains(cFirst) && !(vowels.contains(charArray[1]))) {
sb.append(String.format("av%s" , cFirst));
}
else sb.append(cFirst);
for (int i = 1; i < charArray.length-1; i++){
char c = charArray[i];
char cNext = charArray[i+1];
char cPrev = charArray[i-1];
if (vowels.contains(c) && !(vowels.contains(cNext) || vowels.contains(cPrev))) {
sb.append(String.format("av%s" , c));
}
else sb.append(c);
}
char cLast = charArray[charArray.length-1];
if (vowels.contains(cLast) && !(vowels.contains(charArray[charArray.length-2]))) {
sb.append(String.format("av%s" , cLast));
}
else sb.append(cLast);
return sb.toString();
}
适用于我能想到的所有情况,但可能不是这样做的最佳方式。
我尝试在每个元音前插入一个音节,但有以下限制:
- 在每个 之后的元音 (a, e, i, o, u) 之前, 插入 杂音音节 "av".
- 除非元音前面有另一个元音
其实我已经做到了
public static String translate(String text) {
char [] charArray = text.toCharArray();
StringBuilder sb = new StringBuilder();
for(char c : charArray) {
if (charArray.length < 255){
if (isVowel(c)) {
sb.append(String.format("av%s" , c));
}
else {
sb.append(c);
}
}
}
return sb.toString();
}
static boolean isVowel(char c) {
return (c == 'a') || (c == 'e') ||
(c == 'i') || (c == 'o') ||
(c == 'u');
}
对于没有双元音的单词,它完美地工作:
猫变成了
Cavat
但是双元音不起作用
遇见就变成
Maveavet // Should return Meet
如何检查连续的 2 个字母是否为元音字母,如果是,则不添加音节?
提前致谢
一种方法是自己管理索引,而不是使用增强的 for 循环。这允许您通过检查下一个字符是否存在来 'skip' 超过两个元音块。这样的事情应该有效:
int i = 0;
while (i < charArray.length) {
char c = charArray[i];
if (isVowel(c)) {
if (i + i == charArray.length || isVowel(charArray[i+1])) {
sb.append("av");
} else {
i++;
}
}
sb.append(c);
i++;
}
请注意,当存在三个连续元音时,这无法解决。
这是一个使用普通 for 循环的版本:
public static String translate(String text) {
char [] charArray = text.toCharArray();
StringBuilder sb = new StringBuilder();
Set<Character> vowels = new HashSet<>(Arrays.asList('a','e','i','o','u'));
char cFirst = charArray[0];
if (vowels.contains(cFirst) && !(vowels.contains(charArray[1]))) {
sb.append(String.format("av%s" , cFirst));
}
else sb.append(cFirst);
for (int i = 1; i < charArray.length-1; i++){
char c = charArray[i];
char cNext = charArray[i+1];
char cPrev = charArray[i-1];
if (vowels.contains(c) && !(vowels.contains(cNext) || vowels.contains(cPrev))) {
sb.append(String.format("av%s" , c));
}
else sb.append(c);
}
char cLast = charArray[charArray.length-1];
if (vowels.contains(cLast) && !(vowels.contains(charArray[charArray.length-2]))) {
sb.append(String.format("av%s" , cLast));
}
else sb.append(cLast);
return sb.toString();
}
适用于我能想到的所有情况,但可能不是这样做的最佳方式。