いくつかの変更点についてご説明します。元のコードから、私が気づいたことは、実際にはエラーではなく、頭のスクラッチャーです。どちらの方法(getWinning Numbers()
とgetTicket()
)でもSet<integer>
が返されましたが、メインでは使用しませんでした。だから、私は単にメソッドからの出力を取り出して、メインメソッドに配置しました。ここで、IMHOにする必要があります。このようなメソッドは1つのことを行う必要があり、この場合は整数のセットを返します。印刷もそれ以外のものはありません。
getTicket()
メソッドでロジックを変更しました。私は、あなたが6つの有効な番号を持つまで、ループを設定するだけです。そのループの中で私はtry
ステートメントを使って無効な入力を取り除きます。 try
ステートメントが設定されている方法は、これを達成できる多くの方法の1つです。 try
(guess = Integer.parseInt(userInput);
)の直後のステートメントは、無効な入力問題がポップアップしてNumberFormatExceptionをスローする場所です。入力が無効な場合は、すぐにメッセージを出力し続けるcatch
にドロップします。入力が有効であれば、重複と番号の範囲をチェックするだけです。数字がOKの場合は、pickedNumbers
に追加し、数字を増やしてください。
public class Lottery
{
public static Set<Integer> generateWinningNumbers()
{
Random rndNumbers = new Random();
TreeSet<Integer> winningNumbers = new TreeSet<Integer>();
int max = 40;
int min = 1;
int range;
int sixNum;
for (int i = 0; i < 6; i++)
{
range = max - min + 1;
sixNum = rndNumbers.nextInt(range) + min;
while (winningNumbers.contains(sixNum))
{
sixNum = rndNumbers.nextInt(range) + min;
}
winningNumbers.add(sixNum);
}
return winningNumbers;
}
public static Set<Integer> getTicket(Scanner input)
{
String userInput;
int guess;
TreeSet<Integer> pickedNumbers = new TreeSet<Integer>();
System.out.println("Enter your 6 numbers between 1-40: ");
int numberCount = 1;
while(numberCount < 7)
{
System.out.print(numberCount + ": ");
userInput = input.nextLine();
try
{
guess = Integer.parseInt(userInput);
if(guess > 0 && guess < 41 && (!pickedNumbers.contains(guess)))
{
pickedNumbers.add(guess);
numberCount++;
}
else
{
if (pickedNumbers.contains(guess))
{
System.out.println("Number already picked: " + guess);
}
else
{
System.out.println("Invalid number. Pick a number between 1-40: " + guess);
}
}
}
catch (NumberFormatException e)
{
// bad input
System.out.println("Invalid input: " + userInput);
}
}
return pickedNumbers;
}
}
メインでの変更は、Set
の整数を返すメソッドを利用するようになりました。 2つのSet<Integer>
変数(winningTicket
とuserTicket
)を作成すると、メソッドから返されたセットを取得し、メソッドの結果を出力するのではなく、結果を出力するだけです。
public static void main(String[] args) throws IOException
{
Scanner userInput = new Scanner(System.in);
boolean done = false;
String yesNo;
Set<Integer> winningTicket;
Set<Integer> userTicket;
while(!done)
{
winningTicket = Lottery.generateWinningNumbers();
userTicket = Lottery.getTicket(userInput);
System.out.println("Your ticket was: " + userTicket);
System.out.println("Winning Numbers: " + winningTicket);
System.out.print("\nWould you like to try again? ");
yesNo = userInput.nextLine();
if(!yesNo.equalsIgnoreCase("y"))
{
System.out.println("Done");
done = true;
}
}
userInput.close();
}
これは、[文字列をintの代わりに入力された後にクラッシュからプログラムを停止するためにホット]の
が重複する可能性が役に立てば幸い(http://stackoverflow.com/questions/26375630/hot-to -stop-the-program-from-at-in-of-in-of-in-in-in-of-in-of-in-in-in-in-in-in-in-of-in) – qwerty1423