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 '

このコードはそれをトリミングすると思いました:

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

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

                }else{

                    tokens[k] = " ";

                }

しかし、明らかにそうではありません。どうすればこれを達成できますか?

4

3 に答える 3

1

私はこのコードがそれをトリミングすると思った...

実際、このコードは 1 文字の単語もスペースに置き換えます。

別の問題は、使用している正規表現にあります。1 つまたは複数のスペースを SINGLE 区切り文字として扱いたい。これを行うための正規表現の書き方については、javadocs および/または教科書や講義ノートを参照してください。(注: これが正しく行われていれば、空白を削除する必要はありません。Split が実行してくれます。)

十分なヒント:-)


それも考えましたが、ほとんどのボートの名前は英語で一文字もありません。

そのような仮定をコードに組み込むべきではありません。特に必要がない場合。固定観念は壊れやすいコードにつながります。つまり、仮定が間違っていることが判明したときにコードが壊れてしまうことがあります。

于 2012-05-17T03:38:47.910 に答える
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 に答える
0

あなたの問題は、ブレークを使用していることです。多くの場所で、これによりループが終了するため、後続の単語はまったく処理されません。おそらく、現在の単語/引数のみをスキップしたいので、次のインデックスで for ループを継続する continue を使用する必要があります。

デバッガーを使用するか、いくつかの中間の printf ステートメントを追加して、コード フローをよりよく理解することができます。

于 2012-05-17T03:41:27.343 に答える