1

我的程序正在运行,但不是以我想要的方式运行。这是我想要的输出:

C:\Documents and Settings\Joe King\My Documents\418.85A Java\Projects\Day 6>java Project3 nina pinta "santa maria"



The Nina is decreasing throttle!

    The Nina is ready to launch...

            but the throttle is down, increase throttle!


The Pinta is lowering the main!

    The Pinta is ready to launch...

            but the sail is down, hoist the main!


The Santa Maria is hoisting the main!

    The Santa Maria is ready to launch...

            the sail is up, ahead full!



(press ENTER to exit)

如您所见,Santa Maria 已大写。这是我得到的输出:

C:\Documents and Settings\Joe King\My Documents\418.85A Java\Projects\Day 6>java Project3 nina pinta "santa maria"



The Nina is decreasing throttle!

    The Nina is ready to launch...

            but the throttle is down, increase throttle!


The Pinta is lowering the main!

    The Pinta is ready to launch...

            but the sail is down, hoist the main!


The santa maria is hoisting the main!

    The santa maria is ready to launch...

            the sail is up, ahead full!



(press ENTER to exit)

我的代码无法将 Santa Maria 等名称字符串大写。这是我的代码:

class Project3{

public static void main(String[] args){

    Boat[] boatArray;
    String result = " "; 
    char firstChar;
    char firstLetter;
    char secondLetter;
    int i;

    boatArray = new Boat[args.length];

    if(args.length > 0){

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

            String delimiters = "[ ]";
            int limit = -1;

            String[]tokens = args[i].split(delimiters, limit);

            for( int k = 0 ; k < tokens.length ; ++k ){

                if( tokens[k].length() > 1 ){

                    tokens[k] = tokens[k].trim();

                }else{

                    tokens[k] = " ";

                }

                firstChar = tokens[k].charAt(0);

                if(firstChar == ' '){

                    break;

                }else{

                    if(Character.isUpperCase(firstChar)){

                        break;

                    }else{

                        firstChar = Character.toUpperCase(firstChar);
                        char[] tokenArray = tokens[k].toCharArray();                            
                        String text = new String(tokenArray, 1, (tokenArray.length - 1) );                          
                        tokens[k] = firstChar + text;

                    }

                    result = result + tokens[k];

                    if( k != tokens.length - 1 ){

                        break;

                    }else{

                        result = result.trim();
                        args[i] = result;
                        result = " ";

                    }
                }
            }       

            firstLetter = args[i].charAt(0);

            if((firstLetter == 'B') || (firstLetter == 'C') || (firstLetter == 'N')){

                boatArray[i] = new RaceBoat();
                boatArray[i].christenBoat(args[i]);

            }else{

                boatArray[i] = new SailBoat();
                boatArray[i].christenBoat(args[i]);

            }


        }

        System.out.println("\n");

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

            secondLetter = Character.toUpperCase(args[i].charAt(1));

            if((secondLetter == 'A') || (secondLetter == 'E')){

                boatArray[i].increaseSpeed();
                boatArray[i].goFast();

            }else{

                boatArray[i].decreaseSpeed();
                boatArray[i].goSlow();

            }           

            boatArray[i].launchBoat();
            boatArray[i].whatIsBoatState();

        }

    }else{

        System.out.println("\n\nArgh!... you forgot to enter ship names scalawag!" +
            "\n\n\n\tPlease try again!");

    }

    System.out.println("\n\n(press ENTER to exit)\n\n");

    try{

        System.in.read();

    } catch(IOException e){

        return;
    }
}

}

认为问题可能是解析 santa maria 导致以下问题:

' santa '

' '

' maria '

我认为这段代码会修剪它:

if( tokens[k].length() > 1 ){

                    tokens[k] = tokens[k].trim();

                }else{

                    tokens[k] = " ";

                }

但显然不是。我该如何做到这一点?

4

3 回答 3

1

看看 Commons-LangStringUtils.capitalize函数。

资本化

如果您想了解专业人士的制作方法,您可以获得有用的源代码 :)

这可能会使您的话大写。

StringBuilder b = new StringBuilder();
String[] parts = originalWord.split(" ");
for(String part : parts) {
    String capitalized = part.substring(0, 1).toUppercase() + part.substring(1);
    b.append(capitalized).append(" ");
}
//and then you can remove the last space if it is your taste.
return b.toString();

它缺乏基本的检查,但它会做:)。

祝你好运!

于 2012-05-17T03:32:49.957 回答
1

我认为这段代码会修剪它......

实际上,该代码还将用空格替换任何一个字母的单词。

另一个问题是您使用的正则表达式。您想将一个或多个空格视为一个分隔符。请参阅 javadocs 和/或您的教科书和讲义,了解如何编写正则表达式来做到这一点。(注意:如果你做对了,就不需要修剪空白。Split 会为你做的。)

足够的提示:-)


我也想过这个问题,但大多数船名都没有英文字母。

您不应该将这样的假设硬连接到您的代码中。尤其是当你不需要的时候。硬性假设导致代码脆弱;即,当您的假设有时被证明不正确时,代码会中断。

于 2012-05-17T03:38:47.910 回答
0

你的问题是你正在使用break;在许多地方,这将终止循环,因此根本不会处理后面的单词。可能您只想跳过当前单词/参数,因此您应该使用 continue 它将使用下一个索引继续 for 循环。

您可以使用调试器或添加一些中间 printf 语句来更好地理解代码流。

于 2012-05-17T03:41:27.343 回答