Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以改进这台机器吗?_Java_String_Substring_Translation - Fatal编程技术网

Java 我可以改进这台机器吗?

Java 我可以改进这台机器吗?,java,string,substring,translation,Java,String,Substring,Translation,我是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++

我是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;        
    }
}
package;
公共级PIG转换器{
公共字符串转换(字符串字){
int位置=0;
if(!Is元音(word.charAt(0))){
for(int i=0;i
我能做些什么改进吗

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


谢谢大家!

严格来说,这并不是一种改进,但Java惯例规定方法应该以小写字母开头。

我已经离开Java好几年了,但总的来说,您的代码看起来不错。如果你想挑剔,这里有一些评论:

  • 添加评论。它不必遵循Javadoc规范,但至少要明确地描述接受的参数和预期的返回值,并可能给出一些关于其工作原理的提示(根据第一个字符是否为元音而不同)
  • 您可能希望捕获
    IndexOutOfBoundsException
    ,我认为如果您传递一个长度为零的字符串,可能会发生这种情况
  • 方法名称应为小写
  • is元音
    可以重写
    返回c=='a'| c=='e'
    等等。由于短路,在比较次数方面的性能应相似
我将
原音(char-ch)
改写如下:

return "aeiou".indexOf(ch) != -1;
我会写以下内容:

// String first = word.substring(position, word.length());
   String first = word.substring(position);
我还将重命名方法名称以遵循编码约定

当然,作为我,我也会使用正则表达式而不是
substring
for
循环

System.out.println("string".replaceAll("([^aeiou]+)(.*)", "$2$1ay"));
// ingstray
工具书类
  • 免责声明:我不懂Java

    反向逻辑令人困惑,请将您的
    语句写成如下内容:

        if (IsVowel(word.charAt(0))) {
            return word + "way";
        } else {
            for (int i= 0; i < word.length(); i++) {
    
            // ...
    
            return first + second;
        }
    

    这是家庭作业吗?如果是这样,请将其标记为这样

    • 不清楚“诚实”或“镱”的预期行为
    • 它不尊重大写字母(“Foo”应该变成“Oofay”,AEIOU也是元音)
    • 如果传入空字符串,它将崩溃

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

    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"
            )
        );
    }
    
    请注意,
    问题
    变成了
    估计码头
    ,这是根据的正确翻译。事实上,上面的文字和翻译都是从文章中摘取的

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

    return "aeiou".indexOf(ch) != -1;
    
    • 首先,所有单词都以
      w
      作为前缀,以备不时之需
    • 然后,跳过
      w
      ,查找
      qu
      或非空辅音序列。如果两者都找不到,那么实际单词以元音开头,因此使用捕获lookback抓取
      w
    • 然后重新排列组件以获得翻译
    即:

    "skip" dummy w
    |
    w(qu|[^aeiou]+|(?<=(w)))([a-z]*)   -->  $3-$1$2ay
     \                2\_/ /\______/
      \_________1_________/    3
    
    “跳过”虚拟w
    |
    w(qu |[^aeiou]+|(?$3-$1$2年)
    \                2\_/ /\______/
    \_________1_________/    3
    
    工具书类

      • 我知道这个问题已经有一年多的历史了,但我想我会对它进行修改。这段代码有几处改进

        public String convert(String word)
        {
            int position = 0;
            while(!isVowel(word.charAt(position)))
            {
                ++position;
            }
            if(position == 0)
            {
                return word + "-way";
            }
            else if(word.charAt(0) == 'q')
            {
                ++position;
            }
            return word.substring(position) + "-" + word.substring(0, position) + "ay";
        }
        public boolean isVowel(char character) 
        {
            switch(character)
            {
                case 'a': case 'e': case 'i': case 'o': case 'u':
                    return true;
                default:
                    return false;
            }
        }
        

        首先,代码将找到第一个元音的位置,然后跳出循环。这比使用for循环遍历每个字母并使用break;跳出循环更简单。其次,这将匹配Wikipedia站点上的所有测试用例。最后,由于字符实际上是有限范围的int,因此可以使用switch语句用于提高性能和可读性。

        请不要删除piglatin标记,它与问题相关。我不同意,标记
        piglatin
        完全不相关,但我会让您放心。这种类型的问题属于代码审查,piglatin标记与Apache Pig的语言层相关。通过阅读ag你会看到这与Java中的字符串操作无关。Sergio似乎是个C#家伙。憎恨者会讨厌的。我不讨厌,我真的想学Java。:)这是我一直在寻找的性感。我会测试它。编辑:我得到一个错误:必需:CharSequence Found:Char@Sergio:抱歉,请改用
        indexOf(char)
        。+1表示“作为我,我也会使用regex”(当然还有其余的答案)。这让我笑了。我同意倒过来的逻辑。在我看来,while语句似乎有点复杂。@Sergio Tapia,Java可能有类似于
        .indexOf
        的东西,它将回调作为参数(并且你会使用
        isvotal
        作为回调),这将循环转换为调用和检查。我更喜欢“尽早返回”;缩进级别越高,代码越难阅读。显然,嵌套条件也是bug的主要来源。@tc.,虽然我同意,但我发现它更具个人风格,而不是那种目的。(请参阅:single-
        return
        -per function Adverties。)大概就是这些人认为“goto”总是邪恶的,而我认为不必要地将流控制嵌入数据是邪恶的(这对编译器来说是一种优化的痛苦)。我开始在你的答案中看到ASCII艺术,这是一辆颠倒的卡车:)+1代表艺术。
        public String convert(String word)
        {
            int position = 0;
            while(!isVowel(word.charAt(position)))
            {
                ++position;
            }
            if(position == 0)
            {
                return word + "-way";
            }
            else if(word.charAt(0) == 'q')
            {
                ++position;
            }
            return word.substring(position) + "-" + word.substring(0, position) + "ay";
        }
        public boolean isVowel(char character) 
        {
            switch(character)
            {
                case 'a': case 'e': case 'i': case 'o': case 'u':
                    return true;
                default:
                    return false;
            }
        }