JavaOne测试失败,如何修复?
我曾多次尝试通过void sameNumbers()
方法修复失败,但仍然没有找到解决方案
Junit失败: junit output
问题是,当第一个数组是[1]
而第二个数组是[0, 1]
时,它返回true
,而不是false
有人能解释一下并帮我解决这个问题吗
谢谢
public class SameNumbers {
public static boolean sameNumbers(int[] values1, int[] values2) {
Arrays.sort(values1);
Arrays.sort(values2);
boolean found = false;
if (values1.length == 0 && values2.length == 0) {
found = true;
} else if (values1.length == 0 && values2.length > 0 || values1.length > 0 && values2.length == 0) {
found = false;
} else if (Arrays.equals(values1, values2)) {
found = true;
} else if (values1.length > 0 && values2.length > 1 || values1.length > 1 && values2.length > 0) {
for (int i = 0; i < values1.length; i++) {
for (int k = 0; k < values2.length; k++) {
if (values1[i] == values2[k]) {
found = true;
} else {
found = false;
}
}
}
}
return found;
}
}
class SameNumbersTest {
static final int nbrTests = 20;
private Random random = new Random();
@Test
void sameNumbers1() {
Assertions.assertEquals(true, SameNumbers.sameNumbers(new int[] {}, new int[] {}),
"SameNumbers.sameNumbers(new int[]{}, new int[]{})");
}
@Test
void sameNumbers2() {
for (int i = 0; i < nbrTests; i++) {
int r = random.nextInt(20);
Assertions.assertFalse(SameNumbers.sameNumbers(new int[] {}, new int[] { r }),
"SameNumbers.sameNumbers(new int[]{}, new int[]{r})");
Assertions.assertFalse(SameNumbers.sameNumbers(new int[] { r }, new int[] {}),
"SameNumbers.sameNumbers(new int[]{r}, new int[]{})");
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { r }, new int[] { r }),
"SameNumbers.sameNumbers(new int[]{r}, new int[]{r})");
}
}
@Test
void sameNumbers3() {
for (int i = 0; i < nbrTests; i++) {
int r = random.nextInt(20);
if (r != 1) {
Assertions.assertFalse(SameNumbers.sameNumbers(new int[] { 1 }, new int[] { r, 1 }),
"SameNumbers.sameNumbers(new int[]{1}, new int[]{r, 1})");
Assertions.assertFalse(SameNumbers.sameNumbers(new int[] { r, 1 }, new int[] { 1 }),
"SameNumbers.sameNumbers(new int[]{r, 1}, new " + "int[]{1})");
} else {
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { 1 }, new int[] { r, 1 }),
"SameNumbers.sameNumbers(new int[]{1}, new int[]{r, 1})");
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { r, 1 }, new int[] { 1 }),
"SameNumbers.sameNumbers(new int[]{r, 1}, new int[]{1})");
}
}
}
@Test
void sameNumbers4() {
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { 1, 2, 3 }, new int[] { 3, 2, 1 }),
"SameNumbers.sameNumbers(new int[]{1, 2, 3}, new int[]{3, 2, 1})");
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { 1, 2, 3 }, new int[] { 3, 3, 2, 1 }),
"SameNumbers.sameNumbers(new int[]{1, 2, 3}, new int[]{3, 3, 2, 1})");
Assertions.assertFalse(SameNumbers.sameNumbers(new int[] { 1, 2, 3 }, new int[] { 3, 4, 2, 1 }),
"ameNumbers.sameNumbers(new int[]{1, 2, 3}, new int[]{3, 4, 2, 1})");
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { 1, 2 }, new int[] { 2, 1, 1 }),
"SameNumbers.sameNumbers(new int[]{1, 2}, new int[]{2, 1, 1})");
Assertions.assertTrue(SameNumbers.sameNumbers(new int[] { 1, 2, 2 }, new int[] { 2, 1, 1 }),
"SameNumbers.sameNumbers(new int[]{1, 2, 2}, new int[]{2, 1, 1})");
}
}
# 1 楼答案
# 2 楼答案
在对数组
values1
和values2
进行排序后,可以使用Arrays的equals
函数(就像您已经做的那样):该函数已经检查了两个数组的所有条目和长度是否相同。 所以你可以直接返回结果。 你不需要做更多
编辑:
在你的评论之后:我错过了限制。 你可以先用一个集合消除数组
values1
和values2
中的重复项:在集合中,每个值都是唯一的。通过从数组转换为集合,数组[1,2,3,3,4,5,5]将减少为[1,2,3,4,5]。转换回数组后,可以使用具有唯一元素的数组进行操作
例如,如果你有两个数组[1,2,2,3]和[1,2,3,3,3],它们都将减少到[1,2,3],并且相等
# 3 楼答案
在for循环中,它会检查[0]并将其等于false,但一旦设置为false,就不会中断for循环,因此它会检查[1],并以find=true结束
# 4 楼答案
这些循环无法在found中放入有意义的值
可以写成
你想要的是,像下面这样的东西,它检查values1是values2的子集
在您排序时,更好的算法是:
或者
或者
如果测试失败,测试可能是错误的