java 我试着比较两个整型数组的集合得到的结果我不明白它的来源

b4lqfgs4  于 2023-01-15  发布在  Java
关注(0)|答案(2)|浏览(81)

我正在解决这个密码战形:这是我的代码:

public static void main(String[] args) {
        int[][] ms;

        ms = new int[][] {{1, 2, 3, 4},
                {3, 1, 4, 2},
                {4, 3, 2, 1},
                {2, 4, 1, 3}};
        System.out.println(count_different_matrices(ms));
    }

    private static final Set<int[]> registeredM = new HashSet<>();
    static public int count_different_matrices(int[][] matrices) {
        Arrays.stream(matrices).forEach(m -> {
        if(unwrapPossibleMatrices(m).stream().noneMatch(registeredM::contains)) {
            registeredM.add(m);

        }});
        registeredM.forEach(e -> System.out.println(Arrays.toString(e)));
        return registeredM.size();
    }

    static private List<int[]> unwrapPossibleMatrices(int[] m) {
        return Arrays.asList(new int[][]{
                m,
                {m[2], m[0], m[3], m[1]},
                {m[3], m[2], m[1], m[0]},
                {m[1], m[3], m[0], m[2]}
        });
    }

控制台中接收到的输出:

[1, 2, 3, 4]
[2, 4, 1, 3]
[4, 3, 2, 1]
[3, 1, 4, 2]
4

我期望输出只有[1, 2, 3, 4],我的思路是contains()应该调用a.equals(b),其中ab在本例中的类型是int[],当它们通过相等进行比较时-它将检查数组中的长度和元素是否匹配。(我认为)是对象的地址被检查了--因此,对于具有相同元素的数组给出了不同的结果。我的问题如下:如何修改这段代码来检查数组中传递的实际元素?

dw1jzc5e

dw1jzc5e1#

好的,我已经改变了我的解决方案,正如@Pshemo指出的那样(谢谢:)

public static void main(String[] args) {
        int[][] ms;

        ms = new int[][] {{1, 2, 3, 4},
                {3, 1, 4, 2},
                {4, 3, 2, 1},
                {2, 4, 1, 3}};
        System.out.println(count_different_matrices(ms));
    }
    
    private static final Set<Row> registeredM = new HashSet<>();
    static public int count_different_matrices(int[][] matrices) {
        registeredM.clear();
        Arrays.stream(matrices).forEach(m -> {
        if(unwrapPossibleMatrices(m).stream().noneMatch(registeredM::contains)) {
            registeredM.add(new Row(m));

        }});
        registeredM.forEach(e -> System.out.println(Arrays.toString(e.row())));
        return registeredM.size();
    }

    private static List<Row> unwrapPossibleMatrices(int[] m) {
        return Arrays.asList(
                new Row(m), 
                new Row(new int[]{m[2], m[0], m[3], m[1]}), 
                new Row(new int[]{m[3], m[2], m[1], m[0]}), 
                new Row(new int[]{m[1], m[3], m[0], m[2]})
        );
    }

    record Row(int[] row) {
        @Override
        public int hashCode() {
            return Arrays.hashCode(row);
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Row row1 = (Row) o;
            return Arrays.equals(row, row1.row);
        }
    }
g52tjvyc

g52tjvyc2#

您可以编写一个比较器来比较两个int数组。
下面是一个代码示例。

import java.util.Comparator;
import java.util.Arrays;

public class CompareArrays {
    
    Comparator<int[]> comparator = new Comparator<>() {
        public int compare(int[] a1, int[] a2) {
            if (a1.length != a2.length)
                return a1.length - a2.length;
            for (int i = 0; i < a1.length; i++) {
                if (a1[i] != a2[i])
                    return a1[i] - a2[i];
            }
            return 0;
        }
    };

    public void test(int[] a, int[] b) {
        System.out.println("Array1: " + Arrays.stream(a).boxed().toList());
        System.out.println("Array2: " + Arrays.stream(b).boxed().toList());
        System.out.println(comparator.compare(a, b) == 0 ? "Array1 == Array2" : "Array1 != Array2");
    }

    public static void main(String[] args) {
        CompareArrays program = new CompareArrays();
        
        int[] a = {1, 2, 3, 4};
        int[] b = {1, 2, 3, 4};
        int[] c = {1, 2, 3};
        int[] d = {4, 3, 2, 1};
        int[] e = {1, 2, 3, 4, 5};
        int[] f = {1, 2, 4, 3};
        
        program.test(a, b);
        System.out.println();
        
        program.test(a, c);
        System.out.println();
        
        program.test(a, d);
        System.out.println();
        
        program.test(a, e);
        System.out.println();
        
        program.test(a, f);
    }
}

下面是编译和运行后的输出。

% javac CompareArrays.java
% java CompareArrays
Array1: [1, 2, 3, 4]
Array2: [1, 2, 3, 4]
Array1 == Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 3]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [4, 3, 2, 1]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 3, 4, 5]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 4, 3]
Array1 != Array2

这是一种方法,还有其他方法。
正如你所指出的,==操作符比较两个对象的内存地址,所以如果你创建两个int数组{1,2,3,4},它们将有不同的内存地址,即使两个数组包含相同的数字。
此外,还可以使用Arrays.equals方法。
我刚刚发现了Arrays.equals和Arrays.toString方法。
下面是一个代码示例:

import java.util.Arrays;

public class ArraysTest {

    public void run() {
        int[] a = {1, 2, 3, 4};
        int[] b = {1, 2, 3, 4};
        int[] c = {1, 2, 3};
        int[] d = {4, 3, 2, 1};
        int[] e = {1, 2, 3, 4, 5};
        int[] f = {1, 2, 4, 3};
        
        test(a, b);
        System.out.println();
        
        test(a, c);
        System.out.println();
        
        test(a, d);
        System.out.println();
        
        test(a, e);
        System.out.println();
        
        test(a, f);
    }

    public void test(int[] a, int[] b) {
        System.out.println("Array1: " + Arrays.toString(a));
        System.out.println("Array2: " + Arrays.toString(b));
        System.out.println(Arrays.equals(a, b) ? "Array1 == Array2" : "Array1 != Array2");
    }

    public static void main(String[] args) {
        ArraysTest program = new ArraysTest();
        program.run();
    }
}

下面是我们编译并运行程序后的输出结果。(在Java的后续版本中,我们可以一步完成。)

% java ArraysTest.java
Array1: [1, 2, 3, 4]
Array2: [1, 2, 3, 4]
Array1 == Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 3]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [4, 3, 2, 1]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 3, 4, 5]
Array1 != Array2

Array1: [1, 2, 3, 4]
Array2: [1, 2, 4, 3]
Array1 != Array2

因此,您可以看到Arrays.equals(int[], int[])Arrays.toString(int[])方法非常有用。
java.util.Arrays类为我们提供了一种比较两个int数组(以及任意两个原语数组)的有效方法。

相关问题