嗨,我是Java的新手,我正在做这个实验任务,我们比较两个数组的元素以获得公共元素。我被困在如何摆脱重复。
我当前的代码给出了输出[3,0,5,6,5,0,9,0],所需的常见输出是[3,5,6,9,0,0,0, 0]。
此外,由于我不是那么有经验,请不要发布专业的方法来解决问题,或者经验丰富的"回答我的问题,因为这对我没有任何帮助:D。
谢谢!
public static void main (String[] args) {
int[] a1 = {3, 8, 5, 6, 5, 8, 9, 2};
int[] a2 = {5, 15, 4, 6, 7, 3, 9, 11, 9, 3, 12, 13, 14, 9, 5, 3, 13};
int[] common = new int[a1.length];
System.out.println("Exercise 3: ");
findCommon(a1,a2,common);
}
public static void findCommon(int[] a1, int[]a2, int[] common) {
int num = 0;
for (int i = 0; i < common.length; i++)
{
for (int j = 0; j < a2.length; j++)
{
if (a1[i] == a2[j]) // loops through every index of j, while keeping i at one index
num = a1[i];
for (int k = 0; k < common.length; k++) // makes sure there are no duplicates in common
{
if (num != common[k])
common[i] = num;
}
}
}
for (int elements : common)
System.out.print(elements + " ");
}
答案 0 :(得分:1)
您应该考虑使用Set
来执行此类操作,但由于这是一项练习,因此我在代码中提供了一些解决方案。
基本上你应该将问题分解成碎片,每个碎片都是自己的方法。这样你就可以更轻松地完成它。
arrayIntersect(int[], int[])
此方法的作用是从两个数组创建一个数组。结果数组必须具有两个数组中都存在的唯一元素。
你可以做n。 1使用辅助方法(如下所述)。
inArray(int, int[])
如果数组包含给定元素,则此方法返回true,否则返回false。
示例
public static void main (String[] args) {
int[] a1 = {3, 8, 5, 6, 5, 8, 9, 2};
int[] a2 = {5, 15, 4, 6, 7, 3, 9, 11, 9, 3, 12, 13, 14, 9, 5, 3, 13};
int[] a3 = arrayIntersect(a1, a2);
for (int a : a3) {
System.out.println(a);
}
}
private static int[] arrayIntersect(int[] a1, int[] a2) {
int[] intersect = new int[Math.min(a1.length, a2.length)];
int curIndex = 0;
for (int x : a1) {
if (inArray(x, a2) && !inArray(x, intersect)) {
intersect[curIndex] = x;
curIndex++;
}
}
// resize intersect array to not include unused indexes
int[] tmp = intersect;
intersect = new int[curIndex];
for (int i = 0; i < intersect.length; i++) {
intersect[i] = tmp[i];
}
return intersect;
}
private static boolean inArray(int element, int[] array) {
boolean result = false;
for (int a : array) {
if (element == a) {
result = true;
break;
}
}
return result;
}
答案 1 :(得分:0)
你非常接近正确的anwser,但正在为a2的每个元素执行for循环for (int k = 0; k < common.length; k++)
。因此,当a1存在一个值但a2不存在时,则将旧值num放在公共数组中。如果查看打印的元素,您将看到每次元素只存在于a1中时,元素重复。
代码的结果是
3 3 5 6 5 5 9 9
你输入了正确的标识,但忘记了大括号。如果将大括号放在if (a1[i] == a2[j])
上,结果就是:
3 0 5 6 5 0 9 0
但为什么这些0有?因为当您在java中创建一个int数组时,所有元素都以值0开头。并且您将公共元素放在a1数组中此元素存在的相同位置。您可以通过使用无效数字填充int数组来解决此问题,并忽略它。在此代码中,我假设-1是无效值。
public static void findCommon(int[] a1, int[] a2, int[] common) {
int num = 0;
for (int i = 0; i < common.length; i++) {
common[i] = -1;
}
for (int i = 0; i < common.length; i++) {
for (int j = 0; j < a2.length; j++) {
if (a1[i] == a2[j]) { // loops through every index of j, while keeping i at one index
num = a1[i];
for (int k = 0; k < common.length; k++) // makes sure there are
// no duplicates in common
{
if (num != common[k])
common[i] = num;
}
}
}
}
for (int elements : common) {
if (elements != -1)
System.out.print(elements + " ");
}
}
如果你看到,在if (elements != -1)
我没有放大括号,但它有效。如果你不放大括号,它只会执行下一个命令。