【问题标题】:Compare and count in two arrays not in same order - Java比较和计数两个数组的顺序不同 - Java
【发布时间】:2022-10-13 02:32:01
【问题描述】:

我需要计算代码中有多少相同的数字与猜测。

如果 code = [1, 2, 5, 6] 并且 guess = [4, 1, 3, 2],它应该返回 2。

我不能直接更改参数数组,所以我首先创建了新数组,排序,然后循环查找两者中有多少相同。问题是它无论如何都会返回 4 。

public static int digits(int[] code, int[] guess) {
        int[] sortedCode = new int[code.length];
        int[] sortedGuess = new int[guess.length];
        int digits = 0;
        
        for (int i = 0; i < code.length; i++) {
            sortedCode[i] = code[i];
            sortedGuess[i] = guess[i];
        }
        Arrays.sort(sortedCode);
        Arrays.sort(sortedGuess);
        
        for (int i = 0; i < code.length; i++) {
            if (sortedGuess[i] == sortedCode[i]) {
                digits++;
            }
        }
        return digits;

【问题讨论】:

  • 在您的第一个循环中,您将sortedGuesssortedCode 的内容都设置为code 的内容。
  • 但是想象一下你解决了这个问题,sortedGuess 是 1234,而 sorted code 是 2345。你会得到正确的答案吗?
  • @tgdavies 糟糕,已修复,谢谢!不,它仍然是错误的。如果是 4,则返回 4,但如果是 3、2、1,则主要返回 0。有时它会返回其他错误,但我无法弄清楚模式。
  • 当您应该将索引与数组中的每个索引进行比较时,您正在将索引与索引进行比较
  • @Icarus 我刚刚意识到 sortedGuess[i] == sortedCode[I] 是错误。如何将索引与数组中的每个索引进行比较?

标签: java arrays loops sorting


【解决方案1】:

正如@Icarus 在 cmets 中提到的那样,“当您应该将索引与每个索引进行比较时,您正在将索引与索引进行比较”。

public static int getCorrectDigits(int[] code, int[] guess) {
        int correctDigits = 0;

        if (code.length != guess.length) {
            throw new IllegalArgumentException("Different lengths");
        }

        for (int x = 0; x<code.length; x++){
            for (int y = 0; y<guess.length; y++){
                if (code[x] == guess[y]){
                    correctDigits++;
                }
            }
        }

        return correctDigits;
    }

您还可以将传统的for 循环转换为增强的for 循环。

    for (int j : code) {
            for (int i : guess) {
                if (j == i) {
                    correctDigits++;
                }
            }
        }

【讨论】:

  • 另请参阅增强的for 循环。
  • 尝试猜测 1111 和代码 1234。您期望得到什么答案?你得到了什么?
  • @tgdavies 感谢您的添加。 @cymru_yesac 请在correctDigits++ 之后添加break。这能解决问题吗?
  • @Nili 为什么不为您的代码编写一些基本的单元测试?
  • @tgdavies 我有一个单元测试文件。 Break 修复了猜测中的重复,但如果代码中有重复,它仍然会失败
猜你喜欢
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2015-03-31
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多