如何在单个元音前插入一个音节

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();
}

适用于我能想到的所有情况,但可能不是这样做的最佳方式。