0

for ループ内で switch ステートメントを使用することは合法であるという天気に関する質問があります。Eclipse の下に書かれている方法ではエラーが発生し、for ループの 2 番目のステートメントで switch(n) を使用できません。書きたいことは...

この老人、彼は 1
を演奏しました。彼は私の親指で小物を演奏しました。

for ループと switch ステートメントを使用して、以下の問題を解決するより良い方法はありますか? 異なる番号と異なるケースで10の異なる段落を書きたいと思います。親指1本、靴2本、膝3本…10本まで。

import acm.program.*;

public class SingSong extends ConsoleProgram {

    public void run() {
        for (int n = 1; n <= 10; n++) {
            println("This old man, he played " + n);
            println("He played knick-knack on my" + switch(n));
            println("With a knick-knack, paddy-whack,");
            println("Give your dog a bone");
            println("This old man came rolling home");

            switch (n) {            
                case 1 : println("thumb"); break;
                case 2 : println("shoe"); break;
                case 3 : println("knee"); break;
                case 4 : println("door"); break;
                case 5 : println("hive"); break;
                case 6 : println("sticks"); break;
                case 7 : println("heaven"); break;
                case 8 : println ("pate"); break;
                case 9 : println("spine"); break;
                case 10 : println("shin"); break; 
            }
        } 
    }
}
4

7 に答える 7

6

必要なのは、呼び出すメソッドです。

private String which(int n) {
  switch (n) {
  case 1 : return "thumb";
  case 2 : return "show";
  case 3 : return "knee";
  case 4 : return "door";
  case 5 : return "hive";
  case 6 : return "sticks";
  case 7 : return "heaven";
  case 8 : return "pate";
  case 9 : return "spine";
  case 10 : return "shin";
  default: return "";

  }
}

次に交換

println("He played knick-knack on my" + switch(n));

println("He played knick-knack on my" + which(n));

もう 1 つのより簡潔な方法は、文字列の配列を作成することです。

static final String[] which = {
  "thumb","show","knee","door","hive", "sticks","heaven","pate","spine","shin"};

そして、ただ使う

println("He played knick-knack on my" + which[n]);
于 2012-11-14T11:47:33.540 に答える
4

Map<Integer, String>整数から文字列へのマッピングを含む を作成しMap.get()、文字列を取得するために使用します。

Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "thumb");
// etc
m.put(10, "shin");

println("He played knick-knack on my" + m.get(n));
于 2012-11-14T11:47:50.187 に答える
3
    println("He played knick-knack on my" + switch(n));

これはあなたのスイッチに電話をかけません。switch はメソッドではありません。目的の出力を得るために、

println("This old man, he played " + n);
            println("He played knick-knack on my" );

    switch (n){

            case 1 : print("thumb"); break;
            case 2 : println("shoe"); break;
            case 3 : println("knee"); break;
            case 4 : println("door"); break;
            case 5 : println("hive"); break;
            case 6 : println("sticks"); break;
            case 7 : println("heaven"); break;
            case 8 : println ("pate"); break;
            case 9 : println("spine"); break;
            case 10 : println("shin"); break; 

            }

または、@Marko Topolnik アプローチに従うことをお勧めします。これが最良のアプローチだと思います。

于 2012-11-14T11:47:42.480 に答える
1

SWitch(n) は関数ではないため、そのままでは使用できません。コンパイラにとって、これは switch ステートメントを開始するようなものですが、完全に間違っているため、エラーが返されます。これを正しく行うには、ケース スイッチを別の方法で配置するか、2 行目の直後に配置する必要があると思います。このような:

import acm.program.*;

public class SingSong extends ConsoleProgram {

public void run(){
for ( int n = 1; n <= 10; n++){

    println("This old man, he played " + n);
    print("He played knick-knack on my ");
    switch (n){
    case 1 : print("thumb"); break;
    case 2 : print("show"); break;
    case 3 : print("knee"); break;
    case 4 : print("door"); break;
    case 5 : print("hive"); break;
    case 6 : print("sticks"); break;
    case 7 : print("heaven"); break;
    case 8 : print("pate"); break;
    case 9 : print("spine"); break;
    case 10 : print("shin"); break; 
    }
    println("With a knick-knack, paddy-whack,");
    println("Give your dog a bone");
    println("This old man came roiling home");

      } 
       }

      }

これはうまくいくはずです。または、別の方法に入れます。

 import acm.program.*;


public class SingSong extends ConsoleProgram {
public void run(){

for ( int n = 1; n <= 10; n++){

    println("This old man, he played " + n);
    print("He played knick-knack on my");
    switcher(n);
    print("\n");
    println("With a knick-knack, paddy-whack,");
    println("Give your dog a bone");
    println("This old man came roiling home");
}
}

    private void switcher(int n){
    switch(n){
    case 1 : print("thumb"); break;
    case 2 : print("show"); break;
    case 3 : print("knee"); break;
    case 4 : print("door"); break;
    case 5 : print("hive"); break;
    case 6 : print("sticks"); break;
    case 7 : print("heaven"); break;
    case 8 : print ("pate"); break;
    case 9 : print("spine"); break;
    case 10 : print("shin"); break; 


      } 
       }

      }
于 2012-11-14T11:52:29.593 に答える
0

switchメソッドのように使用しています。次の変更を行うと、機能します。

import acm.program.*;

public class SingSong extends ConsoleProgram 
{
    public void run()
    {
        for ( int n = 1; n <= 10; n++)
        {
            println("This old man, he played " + n);
            println("He played knick-knack on my" + getValue(n));
            println("With a knick-knack, paddy-whack,");
            println("Give your dog a bone");
            println("This old man came roiling home");
        }
    }

    private String getValue(int n)
    {
        switch (n)
        {
            case 1 : return "thumb"; break;
            case 2 : return "shoe"; break;
            case 3 : return "knee"; break;
            case 4 : return "door"; break;
            case 5 : return "hive"; break;
            case 6 : return "sticks"; break;
            case 7 : return "heaven"; break;
            case 8 : return "pate"; break;
            case 9 : return "spine"; break;
            case 10 : return "shin"; break;

            default : return "VALUE NOT FOUND!!";
        }
    } 
}
于 2012-11-14T11:53:57.937 に答える
0

あなたはこれを行うことはできません:

println("He played knick-knack on my" + switch(n));

コードをほぼ同じにしたい場合は、切り替えを実行するメソッドに委譲する必要があります。

代替ソリューションには、一連のif/ else if(やや冗長)、またはルックアップ テーブルとして機能する配列が含まれます。

例えば

// note arrays are indexed from 0
String[] arrayOfObjects = new String[]{"thumb", ....};
println("He played knick-knack on my" + arrayOfObjects(n-1));

Map連続していないインデックス作成がない限り、この状況ではおそらく a はやり過ぎだと思います(可能性は低いです)

于 2012-11-14T11:48:49.167 に答える
-2

for ループ内の switch/case ステートメントは問題ありません。問題は、switch が関数呼び出しではないことです。次のようなことを試してください:

    string obj;
    switch (n){

    case 1 : obj="thumb"; break;
    case 2 : obj="show"; break;
    //Etc
    }


    }
    println("This old man, he played " + n);
    println("He played knick-knack on my" + obj);
    println("With a knick-knack, paddy-whack,");
    println("Give your dog a bone");
    println("This old man came roiling home");
于 2012-11-14T11:47:44.227 に答える