我正在解决这个密码战形:这是我的代码:
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)
,其中a
和b
在本例中的类型是int[]
,当它们通过相等进行比较时-它将检查数组中的长度和元素是否匹配。(我认为)是对象的地址被检查了--因此,对于具有相同元素的数组给出了不同的结果。我的问题如下:如何修改这段代码来检查数组中传递的实际元素?
2条答案
按热度按时间dw1jzc5e1#
好的,我已经改变了我的解决方案,正如@Pshemo指出的那样(谢谢:)
g52tjvyc2#
您可以编写一个比较器来比较两个int数组。
下面是一个代码示例。
下面是编译和运行后的输出。
这是一种方法,还有其他方法。
正如你所指出的,==操作符比较两个对象的内存地址,所以如果你创建两个int数组{1,2,3,4},它们将有不同的内存地址,即使两个数组包含相同的数字。
此外,还可以使用Arrays.equals方法。
我刚刚发现了Arrays.equals和Arrays.toString方法。
下面是一个代码示例:
下面是我们编译并运行程序后的输出结果。(在Java的后续版本中,我们可以一步完成。)
因此,您可以看到
Arrays.equals(int[], int[])
和Arrays.toString(int[])
方法非常有用。java.util.Arrays
类为我们提供了一种比较两个int数组(以及任意两个原语数组)的有效方法。