我正在编写一个彩票计划,现在我有点卡住了。我让用户选择七个号码,最后我希望程序告诉用户他正确回答了哪些号码。
我在理解数组方面遇到了很多麻烦,我不知道如何将正确猜到的数字存储在数组中,然后在结尾处打印数组中的元素。我尝试过各种各样的变化,但没有什么对我有用。
this.viewCtrl.dismiss({"foo" : "bar"});
答案 0 :(得分:1)
我会使用Sets而不是数组。集合比数组有两个优点:
所以这是你应该拥有的逻辑:
HashSet<Integer>
并添加列表的前7个元素。这些是中奖号码Hashset<Integer>
答案 1 :(得分:0)
使用list.contains(v)检查猜测值是否在猜测值中。 像这样:
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
Integer[] userNumbers = new Integer[7];
Integer[] winningNumbers = new Integer[7];
int guesses;
int i;
int counter = 0;
int[] correctGuessed = new int[8];
int x;
ArrayList<Integer> list = new ArrayList<Integer>();
for (x = 1; x < 40; x++) {
list.add(Integer.valueOf(x));
}
Collections.shuffle(list);
for (x = 0; x < 7; x++) {
winningNumbers[x] = list.get(x);
}
System.out.println("Pick 7 numbers between 1 and 39: ");
for (i = 0; i < 7; i++) {
guesses = reader.nextInt();
userNumbers[i] = guesses;
}
List<Integer> winList = Arrays.asList(winningNumbers);
List<Integer> guessList = Arrays.asList(userNumbers);
List<Integer> matchList = new ArrayList<Integer>();
for (Integer guess : guessList) {
if (winList.contains(guess)) {
matchList.add(guess);
}
}
counter = matchList.size();
if (counter == 7) {
System.out.println("You won!");
} else {
System.out.println("You had " + counter + " numbers correct: " + Arrays.toString(matchList.toArray()));
}
}// main
答案 2 :(得分:0)
你的代码有点复杂但工作效果差不多。
一些评论:
包含猜测数字的对象不应该是包含7个元素的数组:int[7]
,否则它总是包含7个元素,而用户可能找到少于7个数字。在这种情况下,其他值将为0(默认值为int),并且您使用Integer [7],它将为NULL
。这可能不是一个合适的选择。你应该声明:
Set<Integer> correctGuessed = new HashSet<Integer>();
而不是int[]correctGuessed=new int[8]
;
当猜到一个数字时,您可以这样分配找到的数字:correctGuessed[x] = userNumbers[i];
你现在可以用这个代替:
correctGuessed.add(userNumbers[i]);
最后,你写下输出:
`System.out.println("You had " + counter + " numbers correct: " + correctGuessed[x] );`
这有两个原因:
- x
在循环后始终为值7
。因此,它不一定是您刚填充的数组索引的值。在原始解决方案中,如果您希望在猜到数字时保留break
的值,则应使用x
:
for(x = 0; x<7;x++){
if(winningNumbers[x] == userNumbers[i]){
correctGuessed[x] = userNumbers[i];
counter+=1;
break;
}
}
您提及&#34;数字正确&#34;在输出中。因此,显示所有猜测的数字似乎更合乎逻辑:
System.out.println("You had " + counter + " numbers correct: " + correctGuessed);
最终的解决方案离我们的非常近:
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int[] userNumbers = new int[7];
int[] winningNumbers = new int[7];
int guesses;
int i;
int counter = 0;
Set<Integer> correctGuessed = new HashSet<Integer>();
int x;
ArrayList<Integer> list = new ArrayList<Integer>();
for (x = 1; x < 40; x++) {
list.add(new Integer(x));
}
Collections.shuffle(list);
for (x = 0; x < 7; x++) {
winningNumbers[x] = list.get(x);
}
System.out.println("Pick 7 numbers between 1 and 39: ");
for (i = 0; i < 7; i++) {
guesses = reader.nextInt();
userNumbers[i] = guesses;
for (x = 0; x < 7; x++) {
if (winningNumbers[x] == userNumbers[i]) {
correctGuessed.add(userNumbers[i]);
counter += 1;
}
}
if (counter == 7) {
System.out.println("You won!");
}
else
System.out.println("You had " + counter + " numbers correct: " + correctGuessed);
}
}
答案 3 :(得分:0)
快速修复的代码如下所示:
System.out.println("Pick 7 numbers between 1 and 39: ");
for(i = 0; i < 7; i++) {
guesses = reader.nextInt();
userNumbers[i] = guesses;
// System.out.println(userNumbers[i]);
for (x = 0; x < 7; x++) {
if (winningNumbers[x] == userNumbers[i]) {
correctGuessed[counter] = userNumbers[i];
counter += 1;
}
}
}
if (counter == 7){
System.out.println("You won!");
}
else
System.out.println("You had " + counter + " numbers correct: " + Arrays.toString(correctGuessed));
然而,正如其他用户已经说过的那样,有很多东西可以改进。您不希望使用数组来存储获胜值,您可以使用Set来执行此操作:
Set<Integer> correctGuesses = new HashSet<>();
for(i = 0; i < 7; i++) {
guesses = reader.nextInt();
userNumbers[i] = guesses;
for (x = 0; x < 7; x++) {
if (winningNumbers[x] == userNumbers[i]) {
correctGuesses.add(userNumbers[i]);
}
}
}
if (correctGuesses.size() == 7){
System.out.println("You won!");
}
else {
System.out.println("You had " + correctGuesses.size() + " numbers correct: " + correctGuesses);
}
我建议根本不使用数组,因为使用它们可能非常复杂。如果你使用Collection类型,你有很多方便的速记方法。您可以使用contains(userGuess)
,而不是使用中奖号码循环数组以查看userNumber是否在其中。您也不需要保存所有内容。如果您不需要保存用户猜到的数字,您可能无法存储它们,只能使用当前猜测。例如:
System.out.println("Pick 7 numbers between 1 and 39: ");
for(i = 0; i < 7; i++) {
int currentGuess = reader.nextInt();
if (winningNumbers.contains(currentGuess)) {
correctGuesses.add(currentGuess);
}
}
但是如果你想确保用户在你的彩票中播放不同的数字,你会想要保存用户的猜测。因此,您可以再次使用Set,并在每次用户猜测时添加猜测。在用户为您提供7个唯一编号之前,您可以使用while
循环继续询问数字。像这样:
while (guessedNumbers.size() < 7){
int currentGuess = reader.nextInt();
guessedNumbers.add(currentGuess);
if (winningNumbers.contains(currentGuess)) {
correctGuesses.add(currentGuess);
}
}
这应该给你足够的材料来重构其他代码,包括JB Nizet和Alex的所有提示。
我可以提一个额外的事情:尝试使用有意图揭示名字的方法和变量。你已经做得很好,但试着尽可能具体,如果int包含1个猜测,则称之为guessedNumber
而不是guesses
。或者如果用户在计数器为7时赢了,你可以引入一个boolean例如,或者一个额外的方法。我必须说代码看起来已经非常好了,考虑到你正在努力使用数组。