比较两个数组,然后使用公共元素制作另一个数组(并且没有重复)

时间:2018-05-28 21:46:37

标签: java arrays for-loop foreach

  

嗨,我是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 + " ");
  }

2 个答案:

答案 0 :(得分:1)

您应该考虑使用Set来执行此类操作,但由于这是一项练习,因此我在代码中提供了一些解决方案。

基本上你应该将问题分解成碎片,每个碎片都是自己的方法。这样你就可以更轻松地完成它。

  1. arrayIntersect(int[], int[])
      

    此方法的作用是从两个数组创建一个数组。结果数组必须具有两个数组中都存在的唯一元素。

  2. 你可以做n。 1使用辅助方法(如下所述)。

    1. inArray(int, int[])
        

      如果数组包含给定元素,则此方法返回true,否则返回false。

    2. 示例

      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)我没有放大括号,但它有效。如果你不放大括号,它只会执行下一个命令。