将两个不同数组中的等效数字连接到一个数组中

时间:2016-03-26 16:44:18

标签: java arrays duplicates

我必须创建两个数组,其中10个随机值介于0和20之间。这些数组会创建另外两个数组:

  • arrayReps包含两个数组之间匹配的数字。例如,对于包含3个值的数组:[3, 2, 4][4, 5, 2]然后arrayReps = [2, 4](顺序无关紧要)
  • arrayUniq包含每个原始数组的唯一值。从前面的示例arrayUniq = [3, 5]开始。

我已经创建了两个随机数组,但是我在arrayReps和arrayUniq上遇到了麻烦,你能帮帮我吗?我的代码:

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class P03ArraysExtractUniqsAndReps {

    public static void main(String[] args){
        Scanner scan1 = new Scanner(System.in);
        Random number = new Random();
        int a = 0;
        int[] randomArray1;
        randomArray1 = new int[10];
        int[] randomArray2;
        randomArray2 = new int[10];
        int[] arrayUniq;
        int[] arrayReps;
        //int[] arrayUniq = new int[10];
        for(int i = 0; i < 10; i++){
            randomArray1[i] = number.nextInt(20);
        }
        for(int i = 0; i < 10; i++){
            randomArray2[i] = number.nextInt(20);
        }
        System.out.println(Arrays.toString(randomArray1));
        System.out.println(Arrays.toString(randomArray2));
    }
}

4 个答案:

答案 0 :(得分:0)

a1的每个元素与a2的元素进行比较。如果找到匹配项,请将该元素存储在arrayReps中,否则将该元素存储在arrayUniq

这样的事情:

for(int i=0;i<a1.length;i++)
{
   for(int j=0;j<a2.length;j++)
   {
      if(a1[i]==a2[j])
           //add the element in arrayReps
      else
           //add the element in arrayUniq
   }
}

答案 1 :(得分:0)

以下是解决方案,根据您的意愿抓住其中一个或两个:

重复 O(n + m)

public static int[] getDuplicates(int[] array1, int[] array2) {
    HashSet<Integer> duplicates = new HashSet<>(); 
    HashSet<Integer> uniques = new HashSet<>(); 
    for(int i : array1) {
        if (!uniques.add(i)) {
            duplicates.add(i);
        } 
    }
    for(int j : array2) {
        if (!uniques.add(j)) {
            duplicates.add(j);
        } 
    }
    return duplicates.stream().mapToInt(i->i).toArray();
}

唯一身份 O(n + m)

public static int[] getUniques(int[] array1, int[] array2) {
    HashSet<Integer> uniques = new HashSet<>();
    for(int i : array1) {
        uniques.add(i);
    }
    for (int j : array2) {
        uniques.add(j);
    }
    return uniques.stream().mapToInt(i->i).toArray();
}

一次性 O(n + m)

如果您不想使用两种方法,只需将getDuplicates(..)方法的主体(它计算重复项和唯一项)计算到main(..)方法。

public static void main(String[] args) {

    int[] array1 = {1,2,5,6,8,9,1};
    int[] array2 = {3,4,5,6,0};

    HashSet<Integer> setDuplicates = new HashSet<>(); 
    HashSet<Integer> setUniques = new HashSet<>(); 
    for (int i : array1) {
        if (!setUniques.add(i)) {
            setDuplicates.add(i);
        } 
    }
    for (int j : array2) {
        if (!setUniques.add(j)) {
            setDuplicates.add(j);
        } 
    }

    int[] duplicates = setDuplicates.stream().mapToInt(i->i).toArray();
    int[] uniques = setUniques.stream().mapToInt(i->i).toArray();

    System.out.println(Arrays.toString(duplicates));
    System.out.println(Arrays.toString(uniques));
}

所有方法都会给你相同的输出:

Duplicates: [1, 5, 6]
Uniques: [0, 1, 2, 3, 4, 5, 6, 8, 9]

答案 2 :(得分:0)

你也可以使用最有效的桶排序和满足bucketSort的条件:max和min值是已知的。

    int[] bucketSortArray = new int[20];
    for(int i=0;i<10;i++){
        bucketSortArray[randomArray1[i]]++;
        bucketSortArray[randomArray2[i]]++;
    }
    System.out.println(Arrays.toString(bucketSortArray));

如果bucketSortArray[15]==1,超过15是唯一的。 如果bucketSortArray[20]>1,比20在Reps中。 如果是0,则忽略。

答案 3 :(得分:0)

这是实现目标的一种方式。

将第一个数字列表与第二个列表进行比较,然后第二个列表中剩下的任何内容也必须是唯一的。

import java.util.ArrayList;

public class UniqueArray {
public static void main(String[] args) 
{
    int[] list1 = {0,4,6,2,8,9};
    int[] list2 = {0,4,3,2,7,5};
    ArrayList<Integer> unique = new ArrayList<Integer>();
    ArrayList<Integer> dups = new ArrayList<Integer>(); 

    boolean isUnique = false;
    int num;

    for(int i = 0; i < list1.length; i++)
    {
        num = list1[i];
        for(int j = 0; j < list1.length; j++)
        {
            isUnique = true;
            if(list1[i] == list2[j])
            {
                isUnique = false;
                list2[j] = -1; // mark as having already been found
                break;
            }
        }
        if(isUnique)
        {
            unique.add(num);
        }
        else
        {
            dups.add(num);
        }
    }

    for(int i=0; i< list2.length; i++)
    {
        if(list2[i]!= -1)
        {
            unique.add(list2[i]);
        }
    }

    System.out.println("Unique:");
    System.out.println(unique);

    System.out.println("Dups:");
    System.out.println(dups);   
}

}