【问题标题】:How do I compare elements between two arrays and then print the equal elements?如何比较两个数组之间的元素,然后打印相等的元素?
【发布时间】:2016-11-26 11:35:30
【问题描述】:

我正在编写一个彩票程序,现在我有点卡住了。我让用户选择七个数字,最后我希望程序告诉用户他正确回答了哪些数字。

我在理解数组时遇到了很多麻烦,以至于我不确定如何将正确猜测的数字存储在数组中,然后在最后打印数组中的元素。我尝试了各种变体,但没有什么对我有用。

package whatevs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
import java.util.Scanner;

public class lottery {

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;
    int[]correctGuessed=new int[8];
    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;
       // System.out.println(userNumbers[i]);
        for(x = 0; x<7;x++){
            if(winningNumbers[x] == userNumbers[i]){    
                correctGuessed[x] = userNumbers[i];
                counter+=1;
            }
    }

    if (counter == 7){
        System.out.println("You won!");
    }
    else
        System.out.println("You had " + counter + " numbers correct: " + correctGuessed[x]  );
    }
}

【问题讨论】:

  • 您真的要使用数组来做到这一点吗?因为更简单和合乎逻辑的解决方案是使用集合。
  • 我可能对数组知之甚少,但我对集合一无所知。这是否意味着我必须重写整个程序?
  • 不,不是整个程序。但是无论如何,整个程序中只有几行代码。会写一个答案让你开始。
  • 我不这么认为,您可以使用您的数组并创建一个整数列表并存储每个相似性的索引!

标签: java arrays


【解决方案1】:

我会使用集合而不是数组。集合比数组有两个优点:

  • 他们确保集合中没有重复(这是您想要的,因为您有 40 个不同的数字,并希望用户选择 7 个不同的数字)
  • 它们的级别要高得多,因此有许多裸数组没有的有用方法

所以这是你应该有的逻辑:

  1. 用 40 个数字填写列表
  2. 随机播放
  3. 创建HashSet&lt;Integer&gt; 并添加列表的前7 个元素。这些是中奖号码
  4. 新建一个空Hashset&lt;Integer&gt;
  5. 要求用户输入数字。将每个数字添加到这个新的 HashSet 中,并不断询问直到集合有 7 个数字
  6. 使用 HashSet 的 retainAll() 方法可以知道哪些猜中的号码也是中奖号码的一部分。 javadoc 是您了解此方法作用的朋友。

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

    • 当然,从一开始就可以用List代替int[]。
    • 顺便说一下,要显示彩票号码,请使用:System.out.println("Lottery numbers are " + Arrays.toString(winList.toArray()));
    【解决方案3】:

    您的代码有点复杂,但几乎可以运行。

    一些备注:

    • 包含猜测数字的对象不应是 7 个元素的数组:int[7],否则它总是包含 7 个元素,而用户可能会发现少于 7 个数字。在这种情况下,其他值将是 0(int 的默认值),如果您使用 Integer[7],它将是 NULL。这可能不是一个合适的选择。你应该声明:
      Set&lt;Integer&gt; correctGuessed = new HashSet&lt;Integer&gt;(); 而不是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。所以,不一定是你刚刚填充的数组的索引值。在您的原始解决方案中,如果您想在猜测数字时保留 x 的值,则应使用 break

    for(x = 0; x<7;x++){
                if(winningNumbers[x] == userNumbers[i]){    
                    correctGuessed[x] = userNumbers[i];
                    counter+=1;
                    break;
                }
        }
    
    • 您在输出中引用“数字正确”。所以,显示所有猜测的数字似乎更合乎逻辑:

      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);
            }
          }
    

    【讨论】:

      【解决方案4】:

      您的代码快速修复如下:

          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 ,并在用户每次猜测时添加猜测。您可以使用while 循环来不断询问号码,直到用户给您7 个唯一号码。像这样的:

      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 won,或额外的方法。我必须说代码看起来已经很不错了,考虑到您正在努力处理数组这一事实。

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 2019-01-17
        • 2016-06-19
        • 2020-02-20
        • 2020-08-15
        • 1970-01-01
        相关资源
        最近更新 更多