使用两个数组中的公共元素创建一个新数组

时间:2019-06-05 02:05:47

标签: java

我必须创建一个方法,该方法返回一个包含来自两个不同数组的公共元素的数组。我知道对此有很多疑问,但是我的与我创建一个新数组时有些不同。

我试图首先计算两个数组中有多少个普通元素,然后创建一个大小为该数量的数组。

之后,我尝试使用for循环将新数组设置为公共元素。

public static int [] commonElements(int []a, int [] b){
      int count=0;
      for(int i=0;i<a.length;i++) {
         for(int j=0;j<b.length;j++) {
           if(a[i] == b[j]) {
             count++;
           }
        }
     }
     int []array= new int[count];

     for(int i=0;i<a.length;i++) {
        for(int j=0;j<b.length;j++) {
           if(a[i] == b[j]) {
              for (int k=0; k<count; k++){

                 array[k]=a[i];
             }
          }
       }
    }
    return array;
 }

这将返回四个-1,因此不起作用。 我还被要求不要使用arraylist,所以我不知道如何使此代码完整。 预期值

  // checking common elements
  System.out.println ("\nLooking for common elements in the arrays "); 
  int [] arr3= {56, -21, -5, 7, 10,  21, 2, -1};
  int [] arr4= {-1, -56, 5, 21, 3 , 7, 4, -6, 2, 90};
  int [] result4 = commonElements(arr3, arr4);
  System.out.println (Arrays.toString(arr3));
  System.out.println (Arrays.toString(arr4));  
  System.out.print ("\nCommon elements array:  ");
  System.out.println (Arrays.toString(result4));

主要是

     Looking for common elements in the arrays 
      [56, -21, -5, 7, 10, 21, 2, -1]
      [-1, -56, 5, 21, 3, 7, 4, -6, 2, 90]

      Common elements array:  [7, 21, 2, -1]

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可能想使用列表存储中间的相交值,然后在方法末尾转换为数组:

public static int[] commonElements(int[] a, int[] b) {
    List<Integer> common = new ArrayList<>();

    for (int i=0; i < a.length; i++) {
        for(int j=0; j < b.length; j++) {
            if (a[i] == b[j]) {
                common.add(a[i]);
            }
        }
    }

    int[] array = common.stream().mapToInt(Integer::intValue).toArray();
    return array;
}

如果您不想记录重复,则将common替换为Set<Integer>

答案 1 :(得分:0)

首先,您需要int []array= new array[count];而不是new int[count];-第二,而不是第三个内部循环,在填充输出时,请保留位置索引,并在遇到重复项时增加位置索引。喜欢,

public static int[] commonElements(int[] a, int[] b) {
    int count = 0;
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            if (a[i] == b[j]) {
                count++;
            }
        }
    }
    int[] array = new int[count];
    int p = 0;
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            if (a[i] == b[j]) {
                array[p] = a[i];
                p++;
            }
        }
    }
    return array;
}

或者,如果使用Java 8+,则可以通过对两个数组的IntStream进行过滤来简化上述操作。喜欢,

return Arrays.stream(a).filter(i -> Arrays.stream(b).anyMatch(x -> x == i))
        .toArray();