首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分词器与猪拉丁程序最后编辑

分词器与猪拉丁程序最后编辑
EN

Code Review用户
提问于 2015-04-24 03:51:53
回答 3查看 4.5K关注 0票数 7

这是我以前的Java程序的更新版本,它要求用户提供一个句子,然后分离单词,然后将句子转换为Pig拉丁语。我以前的计划是可行的,但有一些推特需要做,这是我在收到积极反馈后做的。显然,我在separateWords函数中的循环是检查大写字母两次左右。我已经包括了指导书,供参考和同行编辑代码。谢谢。

  1. 程序将接受一个字符串作为输入,其中所有的单词一起运行,但是每个单词的第一个字符是大写的。将字符串转换为由空格分隔的字符串,并且只有第一个单词以大写字母开头。例如,字符串"StopAndSmellTheRose“将被转换为”停止并闻玫瑰“。

  1. 然后,该程序将任务1的结果字符串中的每个单词转换为"Pig拉丁语“。在Pig拉丁文的一个版本中,您可以通过删除第一个字母,将该字母放在单词的末尾,然后在单词后面添加"ay“来转换一个单词。

例如,对于任务1中的结果字符串“停止并嗅到玫瑰”,Pig拉丁字符串应该是"topSay ndaay mellsay hetay osesray“要求:

  • 您的程序应该有三种方法:主方法、任务1方法和task2方法。
  • 任务1的方法应该返回task1的结果字符串
  • 任务2的方法应该显示Pig拉丁字符串。
代码语言:javascript
复制
public class Assignment9 {
public static void main(String[] args) {    
    // Variables
    String sentence, revisedSentence; 
    
    // Create a Scanner object for keyboard input
    Scanner keyboard = new Scanner(System.in); 
    
    // Get the input string
    System.out.print("Enter sentence: ");
    sentence = keyboard.nextLine(); 
    
    //Close keyboard
    keyboard.close();

    // Call function to perform Task 1
    revisedSentence = separateWords(sentence); 
    
    System.out.print("Revised Sentence: " +revisedSentence); 
    
    // Call function to perform Task 2
    toPigLatin(revisedSentence); 
}

private static String separateWords(String sentence) 
{
    // Variables 
    StringBuilder str = new StringBuilder(sentence); 
    int i = 1; 
    
     // While loop repeats until the end of the sentence
    while (i < str.length())
    {
        // Checks for upper case characters
        if(Character.isUpperCase(str.charAt(i)))
        {
            str.insert(i, ' '); 
            i++;
            char ch = Character.toLowerCase(str.charAt(i)); 
            str.setCharAt(i, ch);
        }
        i++; 
    }
    return str.toString();
}
    
private static void toPigLatin(String revisedSentence) 
{   
    // Variables
    String latin = " "; 
    
    // Split sentence by spaces
    String[] tokens = revisedSentence.split(" ");       
            
    // Convert English sentence into Pig Latin 
    for (int i = 0; i < tokens.length; i++)
    {
        // Get string from array
        String str = tokens[i]; 
        
        // Get first letter from string
        String str1 = str.substring(0, 1); 
        
        // Get substring from string
        String str2 = str.substring(1, str.length()); 
        
        // Concatenate the two strings in a required format
        str2 = str2.concat(str1); 
        
        // Concatenate the result and "AY" 
        str2 = str2.concat("ay"); 
        
        // Make a sentence with all the words 
        latin = latin.concat(str2 + " "); 
    }
    
    // Display pig latin verison
    System.out.println("\nPig Latin Version:" +latin ); 
    }
}
EN

回答 3

Code Review用户

发布于 2015-05-27 02:55:24

你的评论绝对是辱骂。这个特别漂亮..。以自己的方式:

代码语言:javascript
复制
//Close keyboard
keyboard.close();

这些评论都没有用,因为:

  • 他们陈述了显而易见的事实。让代码说出来吧!
  • 他们告诉读者代码在做什么,但不告诉读者为什么要这么做。
  • 他们分散了注意力。读取器/维护者读取注释,然后读取代码,然后下意识地验证注释是否反映了下面的代码。

请参阅这个美丽的答案中关于注释的具体内容--需要记住的两件事:

  • 注释应该清楚地说明代码没有告诉我们的内容。
  • 好代码很少需要评论。

命名也不一致:

代码语言:javascript
复制
StringBuilder str = new StringBuilder(sentence); 

String str = tokens[i]; 

前者更好的名称可以是builder,而后者的有意义的名称可以是token

评论不应取代有意义的名称:

代码语言:javascript
复制
// Get first letter from string
String str1 = str.substring(0, 1); 

如果str1firstLetter..。

票数 8
EN

Code Review用户

发布于 2015-05-27 03:15:45

一致性

这可能看起来很琐碎,也许确实如此;但是,您不一致地使用两种缩进样式:

公共静态空主(String[] args) { //变量字符串语句,revisedSentence;

还有..。

私有静态字符串separateWords(字符串语句){ //变量StringBuilder str =新StringBuilder(语句);

最好坚持一种风格。在您的示例中,Java标准是第一个示例。

命名

这些注释实际上是为了指出代码中的命名问题。在我看来,最明显的例子是:

//变量StringBuilder str =新的StringBuilder(句子);int = 1;// While循环一直重复到句子结束时(i < str.length())

好的命名会使这个评论变得不必要:

代码语言:javascript
复制
StringBuilder builder = new StringBuilder(sentence); 
int i = 1; 

while (i < builder.length())
票数 7
EN

Code Review用户

发布于 2015-05-27 04:12:34

separateWords()

这种形式的循环…

int i= 1;while (i < str.length()) {…i++;}

…最好写成一个for循环。

这些评论是愚蠢的。如果你要写任何评论,写JavaDoc。

代码语言:javascript
复制
/**
 * Transforms "StringsLikeThis" into "Strings like this".
 */
private static String separateWords(String interCaps) 
{
    StringBuilder s = new StringBuilder(interCaps); 
    for (int i = 1; i < s.length(); i++) {
        if (Character.isUpperCase(s.charAt(i))) {
            s.setCharAt(i, Character.toLowerCase(s.charAt(i)));
            s.insert(i++, ' ');
        }
    }
    return s.toString();
}

toPigLatin()

toPigLatin()函数在两方面比separateWords()更糟糕:

  • 代码可重用性:由于toPigLatin()打印它的输出而不是返回它,所以您将永远无法将它用于其他任何事情。您不能像对separateWords()的输出那样,将它的输出输入到另一个字符串转换函数中。您将无法使用它在一个程序的图形或网络界面。您将无法对该函数运行单元测试。
  • 效率:当您执行多个字符串连接时,请使用StringBuilder。由于使用String连接,这里存在大量冗余复制。

这个函数的输出在开头和结尾都有一个额外的空间。我会认为这是个虫子。

如果该句子包含两个连续空格,则在尝试从空单词中提取子字符串时,该函数将崩溃。

String.substring(index)的单参数形式自动将所有的内容都取到末尾。

代码语言:javascript
复制
private static String toPigLatin(String sentence) {
    String[] words = sentence.split(" ");
    StringBuilder latin = new StringBuilder(sentence.length() + words.length * "ay".length());
    for (int i = 0; i < words.length; i++) {
        if (i > 0) {
            latin.append(' ');
        }
        String word = words[i];
        if (!word.isEmpty()) {
            char initial = word.charAt(0);
            char remaining = word.substring(1);
            latin.append(remaining).append(initial).append("ay");
        }
    }
    return latin.toString();
}
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/87816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档