如何比较两个数组之间的元素然后打印相等的元素?

时间:2016-11-26 11:35:31

标签: java arrays

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

我在理解数组方面遇到了很多麻烦,我不知道如何将正确猜到的数字存储在数组中,然后在结尾处打印数组中的元素。我尝试过各种各样的变化,但没有什么对我有用。

this.viewCtrl.dismiss({"foo" : "bar"});

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 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例如,或者一个额外的方法。我必须说代码看起来已经非常好了,考虑到你正在努力使用数组。