2016-05-05 4 views
2

私は、地図を持っている:Map in switch caseのint valueの使い方は?

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

は今、私はいくつかの値を追加しました:

myMap.put("east", generateId()); 
myMap.put("west", generateId()); 
myMap.put("north", generateId()); 
myMap.put("south", generateId()); 

今、私はスイッチケースを使用して一致をチェックしようとしています:

int i = myMap.get("east"); 
int j = myMap.get("west"); 
int k = myMap.get("north"); 
int l = myMap.get("south"); 
switch (myId) { 
    case i: 
     break; 
    case j: 
     break; 
    case k: 
     break; 
    case l: 
     break; 
} 

それは一定の言いますすべての場合(i、j、k、l)で必要とされる表現。これをどうやって解決するのですか?

答えて

-3

caseに使用される値は定数でなければなりません。つまり、ステートメント全体で変更できないようにする必要があります。あなたの1文字変数をfinalにすることで、この問題を解決できます。

+0

試してみましたが動作しません –

+2

@Zirconこの回答は機能しません。それらは** compile-time **定数でなければなりません。これらの変数はfinal宣言されていません。 – khelwood

6

できません。 caseラベルは、コンパイル時に評価可能な定数式でなければならず、iなどの値は実行時にのみ認識されます。

代わりに一連のifelse文を使用してください。

if (myId == i){など

+0

スイッチを使用して他の方法はありませんか? –

+0

@ NongthonbamTonthoiプログラムを実行する前に 'i'、' j'、 'k'、' l'の値を知っていますか?その質問に対するあなたの答えはあなたの質問に対する答えです。 –

+1

@ NongthonbamTonthoi正直なところ、スイッチの使用を強制しないでください。それらは実際にはいくつかの選択ユースケースの外ではそれほど大きくありません。彼らはあなたのコードを膨らませます。列挙型を使用している場合のように、コンパイル時に可能なすべてのオプションを知っているときに使用します。 *本当に*スイッチを使用したい場合は、マップをenumに置き換えてください。新しい方向を追加することは決してないので、あなたのユースケースには理にかなっています。 – Carcigenicate

1

あなただけのスイッチケースではなく、変数の値を使用することができますので、あなたのコードを変更する必要があります。

Set<Integer> set = new HashSet<Integer>(myMap.size()); 
set.add(new Integer(myMap.get("east"))); 
set.add(new Integer(myMap.get("west"))); 
set.add(new Integer(myMap.get("north"))); 
set.add(new Integer(myMap.get("south"))); 

if (set.contains(new Integer(myId))) break; 

あなたはO(1)で(作品をチェックしてあなたを助けるためにSetを使用することができます、コードが少なくなります)。また、スイッチはOOPではありませんので、使用しないでください。

+1

私はあなたの解決策 –

1

あなたの地図は正しいですか?

Map<Integer, String> myMap = new HashMap<>(); 
    myMap.put(generateId(), "east"); 
    myMap.put(generateId(), "west"); 
    myMap.put(generateId(), "north"); 
    myMap.put(generateId(), "south"); 
    switch (myMap.get(1)) { 
     case "north": 
      break; 
     case "south": 
      break; 
     case "east": 
      break; 
     case "west": 
      break; 
    } 
+0

を試してみますか?generateId()が2つのレコードに対して同じ番号を返したらどうしますか? –

+0

@AdnanIsajbegovic - 次に2番目の 'put'は最初のものを上書きします。 – OldCurmudgeon

+0

@OldCurmudgeon私はそれを試してみる –

関連する問題