2016-05-01 18 views
0

私は私の演習の試合を行いました。オプションがyの場合は、新しいプレイヤーのために今までに入力された文字列のうち、 "プレイヤーはすでにチームに入っています"が3回発生します。ifとelse statemenhtで何が間違っていますか?

import java.util.ArrayList; 
import java.util.Scanner; 

public class Players { 
    public static void main(String[] args) { 
     ArrayList<String> players = new ArrayList<>(); 
     players.add("Torres"); 
     players.add("Ronaldo"); 
     players.add("Rooney"); 
     System.out.println("This is the current items in the players \n" + players); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("Do you want to buy more players ???? y/n"); 
     String option = sc.nextLine(); 

     if (option.equalsIgnoreCase("y")) { 

      System.out.println("Please enter your favorite player "); 
      String newplayer = sc.nextLine(); 
      for (int i = 0; i < players.size(); i++) { 
       if (newplayer.equalsIgnoreCase(players.get(i))) { 
        System.out.println("The player is already in the team "); 
       } else { 
        players.add(newplayer); 
       } 
      } 

      System.out.println("New and old players are " + players); 
     } else { 
      System.out.println("The current players we have are " + players); 
     } 

    } 

} 
+0

ああ問題は、SECは、あなたのループ – DarkV1

+0

ヒントに関係しています...私は解決策を投稿してみましょう...です:それぞれがチェックするとき、何が起こります人は新しいプレーヤーと同等ではありませんか?ヒント2:プレイヤーに追加する意思決定はいつ行うべきですか(ループの適切な場所にありますか?) – Pshemo

+0

まったく...同じプレーヤーではない人を追加します。インデックスがまだ0の場合でも、 – DarkV1

答えて

0

これは以下のようになっている場合は、あなたの周りのforループを削除する必要があります。

for (int i = 0; i <players.size() ; i++) {//its because of this loop that if your input is in players list it loops three times and prints "...already in team" 
    if (newplayer.equalsIgnoreCase(players.get(i))){ 
     System.out.println("The player is already in the team "); 
    } else { 
     players.add(newplayer); 
    } 
} 

をここであなたは(あなたがあなたのリストに3人のプレーヤーを持っているように)3回行くループを実行しています。あなたはそのプレイヤーは以下のようにあなたの方法でブレークを使用して、チームにすでにある見つけたら、ループを続けるべきではありません。

for (int i = 0; i <players.size() ; i++) { 
    if (newplayer.equalsIgnoreCase(players.get(i))){ 
     System.out.println("The player is already in the team "); 
     break; 
    } else { 
     players.add(newplayer); 
    } 
} 

またはより良い、あなたは小文字ですべてのあなたのプレーヤーを保存し、その後にcontainsメソッドを使用します以下のようなプレーヤーのリスト:

if (players.contains(newplayer.toLowerCase())) { 
    //player exist 
} else { 
    // add player 
} 
+0

彼はそれをループのために必要とします – DarkV1

+1

私は彼がチーム全体を走り抜けて、その人が存在するかどうかを見たいと思います...それが存在しなければプレーヤーを追加してください。 – DarkV1

+0

だから、@ DarkV1と思われます。 –

0

問題は、あなたの文の他の部分である

else { 
    players.add(newplayer); 
    } 

すべてのインデックスと呼ばれ、他のことは、(条件文を通して20で実行されます。) ifを満たさない。 ループが介入し、プレーヤーがチームを持たないことが判明した後であれば、呼び出す必要があります。

論理/擬似コード:したがって、ループが満たされていない箇所へのインデックスiの最後の実行が終了すると、elseステートメントが実行されます。したがって、ループが繰り返し実行され、break文に達していない場合は、プレーヤにチームがないことを意味します。次に、プレーヤを追加します。

チェックプレイヤーがすでにある場合には、仕事を得るだろうということ for loopからプレイヤーを追加 のロジックを抽出
for (int i = 0; i < players.size(); i++) { 
      if (newplayer.equalsIgnoreCase(players.get(i))) { 
       System.out.println("The player is already in the team "); 
      break; 
      } 
      if(i = players.size()-1&& !newplayer.equalsIgnoreCase(players.get(i)) 
      { 
       //If the loop is iterated through and does not satisfy the first conditional, then that means it will reach this conditional without breaking. Which also means that the player does not have a team 

        players.add(newplayer); 
      } 
     } 
+0

@BoLin私が書いたforループはうまくいくはずです – DarkV1

+0

それはうまくいくでしょうが、それは非効率的です:あなたが10人のプレイヤーを持っていて、追加しようとしている新しいプレーヤーがリストにないと言う。新しいプレーヤーを追加するだけで、20回のテストが終了します。 2回の名前でテストを実行していることは言うまでもありません。 –

+0

はい2つのif文を意味します。相互排他的ではないため、繰り返しごとにチェックされます。 –

0

。 また、別の方法でロジックをカプセル化してプレーヤーを検索する機能を再利用することもでき、不要なifのチェックを避けることができるため、より効率的です。

これを試してください。

String newplayer = sc.nextLine(); 
boolean playerExists = false; 
for (int i = 0; i < players.size(); i++) { 
    if (newplayer.equalsIgnoreCase(players.get(i))) { 
     playerExists = true; 
     break; 
    } 
} 
if(playerExists){ 
    System.out.println("The player is already in the team "); 
} else { 
    players.add(newplayer); 
} 

または別の方法でアプローチして

if(playerExists()){ 
    System.out.println("The player is already in the team "); 
} else { 
    players.add(newplayer); 
} 

// change access modifier and parameters according to your specific scenario... 
private boolean playerExists(String player){ 
    for (int i = 0; i < players.size(); i++) { 
     if (player.equalsIgnoreCase(players.get(i))) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

出力は同じです。あなたはメソッドのループの責任を委任しました。 – DarkV1

+0

@ DarkV1はい出力は同じになりますが、より効率的です。私はあなたの答えにコメントを追加しました –

関連する問題