有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以改进这个PigLatin转换器吗?

我是Java的新手,我为PigLatin做了一个小翻译

package stringmanipulation;

public class PigLatinConverter {
    public String Convert(String word){
        int position = 0;
        if (!IsVowel(word.charAt(0))) {
            for (int i= 0; i < word.length(); i++) {
                if (IsVowel(word.charAt(i))) {
                    position = i;
                    break;
                }
            }
            String first = word.substring(position, word.length());
            String second = word.substring(0, position) + "ay";

            return first + second;
        } else {
            return word + "way";
        }
    }

    public boolean IsVowel(char c){
        if (c == 'a')
            return true;
        else if(c == 'e')
            return true;
        else if(c == 'i')
            return true;
        else if(c == 'o')
            return true;
        else if(c == 'u')
            return true;
        else
            return false;        
    }
}

我能做些什么改进吗

在最新的Java版本中是否有我可能不知道的漂亮Java技巧?我是C#出身

谢谢!


共 (2) 个答案

  1. # 1 楼答案

    严格来说,这并不是一种改进,但Java约定要求方法应该以小写字母开头

  2. # 2 楼答案

    下面是一个完整的重写,如果您知道如何读取正则表达式,那么代码的可读性会更高:

    String[] words =
        "nix scram stupid beast dough happy question another if".split(" ");
    
    for (String word : words) {
        System.out.printf("%s -> %s%n", word,
            ("w" + word).replaceAll(
                "w(qu|[^aeiou]+|(?<=(w)))([a-z]*)",
                "$3-$1$2ay"
            )
        );
    }
    

    这将打印(as seen on ideone.com):

    nix -> ix-nay
    scram -> am-scray
    stupid -> upid-stay
    beast -> east-bay
    dough -> ough-day
    happy -> appy-hay
    question -> estion-quay
    another -> another-way
    if -> if-way
    

    注意question变成了estion-quay,这是根据Wikipedia article的正确翻译。事实上,以上文字和翻译摘自文章

    正则表达式的工作方式如下:

    • 首先,所有单词都以w作为前缀,以防万一
    • 然后,跳过w,寻找qu或非空的辅音序列。如果两者都找不到,那么实际单词以元音开头,所以使用捕获lookback获取w
    • 然后重新排列组件以获得翻译

    也就是说:

    "skip" dummy w
    |
    w(qu|[^aeiou]+|(?<=(w)))([a-z]*)   -->  $3-$1$2ay
     \                2\_/ /\______/
      \_________1_________/    3
    

    参考文献