在Java中查找两个已排序数组的交集

时间:2015-02-08 04:08:15

标签: java arrays

    public class intersect {
  public static void find(int[] a, int[] b, int[] acc) 
  {
    int position = 0;
    for (int j = 0; j < a.length; j++) {
      for (int k = 0; k<b.length; k++) {
        if (a[j] == b[k]) {          
          acc[position] = b[k];
          position++;
        }
      }
    }
    System.out.println(java.util.Arrays.toString(acc));
  }

public static void main (String[] s)
{
  int[] acc = new int[2];
  int[] a = {1,2,3};
  int[] b = {2,3,4};
  find(a, b, acc);
}
}

我已经编写了上面的代码来解决这个问题。 但是如果你看,这个功能非常有限,因为我每次都要改变acc的长度。这意味着我必须知道有多少元素相交。在这种情况下,数组{1,2,3}和{2,3,4}共有{2,3},因此acc的长度为2。

我确信有数百种方法可以解决这个问题,但我似乎无法想出解决这个问题的方法。

请帮忙!

5 个答案:

答案 0 :(得分:1)

如果您的教授希望您使用数组,则可以使用以下方法:

public static int[] resize(int[] arr)
{
    int len = arr.length;
    int[] copy = new int[len+1];
    for (int i = 0; i < len; i++)
    {
        copy[i] = arr[i];
    }
    return copy;
}

这会将数组的大小增加1.您可以使用它。顺便说一句,您没有使用他们在find()方法中排序的事实。你应该做的是:

public static void find(int[] a, int[] b, int[] acc)
{
    int a_index = 0, b_index = 0, acc_index = -1;
    int a_element, b_element;
    while (a_index < a.length && b_index < b.length)
    {
        a_element = a[a_index]; b_element = b[b_index];
        if (a_element == b_element)
        {
            acc = resize(acc);
            acc[++acc_index] = a_element;
            a_index++; b_index++;
        } else if (b_element < a_element) {
            b_index++;
        } else {
            a_index++;
        }
    }
    System.out.println(java.util.Arrays.toString(acc));
}

此方法现在效率更高。 Working example

答案 1 :(得分:0)

使您的交集数组的大小与原始数组中较小的一样。这样,你就不可能增加它的容量。

然后,您可以使用Arrays.copy将结果转换为适当大小的数组。

答案 2 :(得分:0)

不确定这是否是最佳解决方案,但您不需要提前对交叉点的大小进行硬编码(这是您关注的一件事)。

当您遍历两个数组时,可以将两个集合中找到的元素添加到StringBuilder(以及一些分隔符,我在下面的示例中使用了逗号)。完成后,您可以致电toString()&amp;然后split()使用分隔符获取String []。此时,您可以将这些String对象转换为int基元和&amp;返回一个int []。

public class Scratch {

public static void main(String[] s) {
    int[] a = {1, 2, 3};
    int[] b = {2, 3, 4};
    int[] intersection = findIntersection(a, b);
    System.out.println(Arrays.toString(intersection));
}

public static int[] findIntersection(int[] a, int[] b) {
    StringBuilder intersectionStringBuilder = new StringBuilder();
    for (int j = 0; j < a.length; j++) {
        for (int k = 0; k < b.length; k++) {
            if (a[j] == b[k])
                intersectionStringBuilder.append(a[j] + ",");
        }
    }
    String[] intersectionStringArray = intersectionStringBuilder.toString().split(",");
    int[] intersection = new int[intersectionStringArray.length];
    for (int current = 0; current < intersectionStringArray.length; current++) {
        intersection[current] = Integer.parseInt(intersectionStringArray[current]);
    }
    return intersection;
}

}

答案 3 :(得分:0)

要找到2个排序数组的交集,请按照以下方法进行操作:

1)使用两个索引变量i和j,初始值为0 2)如果array1小于array2,则递增i。 3)如果array1大于array2,则递增j。 4)如果两者相同,则打印其中任何一个,并同时增加i和j。

检查此链接以获取更多信息

https://www.geeksforgeeks.org/union-and-intersection-of-two-sorted-arrays-2/

public class FindIntersection {

static void findInterSection(int array1[], int array2[], int array1NoOfElements, int 
array2NoOfElements) {

    int i = 0, j = 0;

    while (i < array1NoOfElements && j < array2NoOfElements) {
        if (array1[i] < array2[j]) {                 
            i++;
        } else if (array2[j] < array1[i]) {          
            j++;
        }
        // if both array elements are same
        else {
            System.out.println(array2[j++] + " ");
            i++;                 
        }
    }
}

public static void main(String[] args) 
{
    int myFirstArray[] = { 1, 2, 4, 5, 5 };
    int mySecondArray[] = { 2, 3, 5, 7 };
    int m = myFirstArray.length;
    int n = mySecondArray.length;

    findInterSection(myFirstArray, mySecondArray, m, n);
}
}

答案 4 :(得分:0)

for(int i=0;i<arr1.length;i++){
    for(int j=0;j<arr2.length;j++){
        if(arr1[i]==arr2[j] && !index.contains(j)){
            list.add(arr1[i]);
            index.add(j);
            break;
        }
        
    }
}

int result[]=new int[list.size()];
int k=0;
for(int i:list){
    result[k]=i;
    k++;
}


 for(int i=0;i<result.length;i++){
     System.out.println(result[i]); 
 }
       
    return result;
}