【问题标题】:Are there any ways to make this simple program more efficient?有什么方法可以让这个简单的程序更有效率吗?
【发布时间】:2018-11-05 16:13:23
【问题描述】:

该程序非常简单:它接受一个字符串并将元音替换为“_”,然后打印反转的字符串。我只是在寻找使我的代码更专业的方法,并希望得到一些提示。

import java.util.Scanner;

public class reverse_string {

    public static void main (String[] args){

        Scanner scan = new Scanner(System.in);

        String input, reverseInput;
        String legolas = new String();

        System.out.println("Enter any input");

        input = scan.nextLine();

        StringBuilder newString = new StringBuilder(input);

        System.out.println("The data you entered is: "+input);

        for (int i =0; i <input.length();i++){

            if (testIfVowel(input.charAt(i))){
                newString.setCharAt(i,'_');
            }
            else{
                newString.setCharAt(i, input.charAt(i));
            }

        }
        for(int i = input.length()-1;i>=0;i--){
            legolas = legolas +input.charAt(i);
        }

        reverseInput=reverseOrder(newString);

        System.out.println("Your old data was: "+input+"\nYour new data is: "+newString +"\nYour old data in reverse is: "+legolas+"\nYour new data in reverse is: "+ reverseInput);

    }



    public static boolean testIfVowel(char x){
        if(x =='a'||x=='A'||x=='e'||x=='E'||x=='i'||x=='I'||x=='o'||x=='O'||x=='u'||x=='U'){
            return true;
        }
        else{
            return false;
        }
    }

    public static String reverseOrder(StringBuilder x){

        String string= new String();

        for(int i = x.length()-1;i>=0;i--){

            string = string + x.charAt(i);
        }

        return string;
    }
}

【问题讨论】:

  • 您应该尝试将其发布到Code Review
  • 如果这已经在工作并且您正在寻找有关如何改进它的建议,则应该在Code Review
  • 附带说明:使用有意义的变量名可以更容易地理解您的代码并对其进行推理。因此,字符串的名称(例如“legolas”)没有多大帮助。甚至像“x”和“c”这样的名称也可能很容易出错,尤其是当它们以不同的方法用于不同的事物时。
  • StringBuilder 有一个方法 reverse() 可以做你想做的事。

标签: java computer-science


【解决方案1】:

既然您只是用_ 替换元音,为什么不使用java 为您提供的replaceAll 方法和一些匹配元音的正则表达式。

str.replaceAll("[aeiou]", "_");

并使用

反转它
reverseInput = new StringBuilder(str).reverse().toString()

这就是改进后最终代码的样子

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String input, reverseInput;
    System.out.println("Enter any input");
    input = scan.nextLine();
    reverseInput = new StringBuilder(input).reverse().toString();
    String withoutVowels = input.replaceAll("[aeiou]", "_");
    String withoutVowelsReversed = new StringBuilder(withoutVowels).reverse().toString();
    System.out.println("The data you entered is: " + input);
    System.out.println("Your old data was: " + input + "\nYour new data is: " + withoutVowels + "\nYour old data in reverse is: " + reverseInput + "\nYour new data in reverse is: " + withoutVowelsReversed);
}

【讨论】:

    【解决方案2】:

    我建议您的逻辑过于复杂。例如,您真的需要只使用一次 次的testIfVowel 方法吗?我怀疑。

    我会做这样的事情(伪代码):

    resultString = '';
    for (i = 0; i < length(s); i++) {
      if ("AEIOUaeiou".indexOf(s[i]) != 0) {
        resultString = '_' + resultString;
      } else {
        resultString = s[i] + resultString;
      }
    }
    

    (您可以使用任何语言进行此操作。)

    请注意,元音测试现在变得简单明了,显然适用于大写和小写版本。并且,如何创建“反转字符串”,一次一个字符,只需将新字符插入到最初为空的 resultString 的 front 处。

    也许最重要的是(对我而言),这个版本“非常容易阅读”。我不需要查看太多代码来检查它是否可以工作。如果你愿意的话,它“直奔主题”。

    我觉得更干净了...

    【讨论】:

    • 你的意思是 s.length() 吗?
    【解决方案3】:

    这似乎不需要比以下更难:

    String result =
        new StringBuilder(input.replaceAll("[AEIOUaeiou]", "_"))
            .reverse()
            .toString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多