如何颠倒短语中单词的顺序并颠倒单词中的字母?

时间:2019-10-15 21:49:37

标签: java

两个问题:

  1. 在用户输入的短语(短语表示两个或多个单词,每个单词之间都有空格)中,仅最后两个单词被反转,而该短语中没有其他单词被反转甚至被打印。

  2. 我的代码可以逆转一个单词(单词表示一个单词)中字母的顺序,似乎没有打印任何内容,但是它无休止地接受输入,没有结果。

重要说明:禁止使用StringBuilder,数组或任何其他“高级”工具。实际上,最好只使用AP Computer Science指南中引用的方法(虽然不是必需的)。我尝试了很多事情,包括调整参数,不同的串联等等。

我希望“这是一个字符串”的输出为“这是一个字符串”。而是打印“字符串a”。 我希望“ heck”的输出为“ kceh”。相反,我什么也没得到。

注意:代码中的注释是我还有的其他担忧和问题,也意在帮助更好地理解我的代码。抱歉,如果有点混乱,这是我第一次真正评论自己的代码。

    Scanner userInput = new Scanner(System.in);

    System.out.print("Enter a word or phrase: ");
    String str = userInput.nextLine();  //user-input string 

    String reversePhrase = "";  //placeholder for reversed phrase
    String reverseWord = "";    //placeholder for reversed word
    char reverseLetter = ' ';   //placeholder for letters in reversed word

    for(int position = 0; position < str.length(); position++)
    {
        if(str.indexOf(" ") > -1)   //checks for space in the user-input string
        {
            while(str.indexOf(" ") > -1)
            {
                reversePhrase = str.substring(0, str.indexOf(" ")); //this might be the problem, but i'm stuck on any solutions
                str = str.substring(1 + str.indexOf(" "));
                reversePhrase = str + " "+ reversePhrase;
            }
            System.out.println(reversePhrase);  //only reverses and prints last two words in phrase
        }
        else if(!(str.indexOf(" ") > -1))   //if there's no space in the user-input string
        {
            for(position = str.length() - 1; position >= 0; position --)    //does this conflict with the "for" parameter above?
            {
                while(position >= 0)    //wasn't sure what to put for this parameter
                {
                    reverseLetter = str.charAt(position);
                    reverseWord = reverseLetter + reverseWord;
                }
            }
            System.out.println(reverseWord);
        }
    }

3 个答案:

答案 0 :(得分:3)

编写代码时,请始终遵循KISS原则。保持简单愚蠢。您迷失在嵌套的for-if-while循环中,这使得很难弄清楚哪里出了问题。

另一个原则是:不要让您的方法重载多个任务。使用小型且简单的方法,一次仅执行一项任务。例如,在下面,我将reversePhrasereverseWord放入了自己的方法。这可以帮助您制定干净的主要方法。

public static void main(String args[]) {
    Scanner userInput = new Scanner(System.in);
    System.out.print("Enter a word or phrase: ");
    String str = userInput.nextLine();

    //if input contains spaces call reversePhrase otherwise reverseWord
    //str.contains(" ") is IMO cleaner, but you can change it to str.indexOf(" ") > -1 if you find it better
    if(str.contains(" ")){
        System.out.println(reversePhrase(str));
    }
    else{
        System.out.println(reverseWord(str));
    }
}

private static String reverseWord(String input) {
    String result = "";
    for(int i = input.length()-1; i >= 0; i--){
        result = result + input.charAt(i);
    }
    return result;
}

private static String reversePhrase(String input) {
    String result = "";
    while(input.contains(" ")){
        result = result + input.substring(input.lastIndexOf(" ")+1) + " ";
        input = input.substring(0, input.lastIndexOf(" "));
    }
    return result + input;
}

答案 1 :(得分:2)

在您的while循环中:

while(position >= 0){    //wasn't sure what to put for this parameter
     reverseLetter = str.charAt(position); // position stays the same
     reverseWord = reverseLetter + reverseWord;
}

它不会更改position的值。 (position永远不会为0)我建议在结尾处添加position--,如下所示:

while(position >= 0){    //wasn't sure what to put for this parameter
     reverseLetter = str.charAt(position); // position stays the same
     reverseWord = reverseLetter + reverseWord;
     position--;
}

它将更改position变量的值。

此外,您的代码中有一个if和一个else if。我建议将else if更改为else,因为这样做毫无意义:

boolean randomBoolean = new java.util.Random().nextBoolean();
if(randomBoolean){...}
else if(!randomBoolean){...} // If randomBoolean == false, then this code will execute anyway

答案 2 :(得分:1)

我删除了for循环之一,因为您不需要它。同样,对于一个单词的情况,while循环。对于第一种情况,您可以使用另一个String临时保存最后一个单词。结果如下:

public static void main(String[] args) {
    Scanner userInput = new Scanner(System.in);

    System.out.print("Enter a word or phrase: ");
    String str = userInput.nextLine();  //user-input string

    String reversePhrase = "";  //placeholder for reversed phrase
    String reverseWord = "";    //placeholder for reversed word
    char reverseLetter;   //placeholder for letters in reversed word
    final String space = " ";

    if(str.contains(space)) {
        while(str.contains(space))
        {
            int i = str.lastIndexOf(space);
            String lastWord = str.substring(i);
            str = str.substring(0, i);
            reversePhrase += lastWord;
        }
        //We add the first word
        reversePhrase = reversePhrase + space + str;
        System.out.println(reversePhrase.trim());
    }
    else {
        for(int position = str.length() - 1; position >= 0; position --) {
            reverseLetter = str.charAt(position);
            reverseWord =  reverseWord + reverseLetter;
        }
        System.out.println(reverseWord);
    }
}