Java - 在两个不同的数组

时间:2017-06-12 07:39:22

标签: java arrays

我需要在两个不同的数组中找到独特的元素。

public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
        int[] arr2 = new int[] { 5, 6, 7, 8 };

        boolean contains = false;
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr2.length; j++) {
                if (arr1[i] == arr2[j]) {
                    contains = true;
                    break;
                }
            }

            if(!contains){
                list.add(arr1[i]);
            }
            else{
                contains = false;
            }
        }
        System.out.println(list);

    }

但在这里我得到[1,2,3,4]作为输出。但预期的输出是[1,2,3,4,7,8]。我不确定我在这里做错了什么。我需要传统的方式。我不想使用任何内置方法来实现这一点。

注意:我觉得它不重复,因为提供的解决方案是找不到两个数组上的唯一元素。

11 个答案:

答案 0 :(得分:6)

这解决了您的问题:

public static void main(String[] args) {

    // Make the two lists
    List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 4, 5, 6);
    List<Integer> list2 = Arrays.asList(5, 6, 7, 8);
    // Prepare a union
    Set<Integer> union = new HashSet<Integer>(list1);
    union.addAll(list2);
    // Prepare an intersection
    Set<Integer> intersection = new HashSet<Integer>(list1);
    intersection.retainAll(list2);
    // Subtract the intersection from the union
    union.removeAll(intersection);
    // Print the result
    for (Integer n : union) {
        System.out.println(n);
    }
}

答案 1 :(得分:1)

如果您使用的是java 8,我建议使用此解决方案:

public static void main(String[] args) {
    int[] arr1 = new int[]{1, 2, 3, 4, 5, 6};
    int[] arr2 = new int[]{5, 6, 7, 8};

    List<Integer> list = new ArrayList<>();//create a list or Integers
    //add the values of the two arrays in this list
    list.addAll(Arrays.stream(arr1).boxed().collect(Collectors.toList()));
    list.addAll(Arrays.stream(arr2).boxed().collect(Collectors.toList()));

    //we need a set to check if the element is duplicate or not
    Set<Integer> set = new HashSet();
    List<Integer> result = new ArrayList<>(list);

    //loop throw your list, and check if you can add this element to the set
    // or not, if not this mean it is duplicate you have to remove it from your list
    list.stream().filter((i) -> (!set.add(i))).forEachOrdered((i) -> {
        result.removeAll(Collections.singleton(i));
    });

    System.out.println(result);
}

<强>输出

[1, 2, 3, 4, 7, 8]

要解决此问题,我根据这些帖子:Identify duplicates in a List

答案 2 :(得分:1)

这里是另一个流媒体(Java 8)解决方案。使用流时,应避免在变量外修改流。

这里的想法是将列表合并,然后计算每个项目的出现次数。计数为1的所有项目仅在一个列表中。这些被收集到结果列表中。

    //using here Integer instead of atomic int, simplifies the union.
    Integer[] arr1 = new Integer[]{1, 2, 3, 4, 5, 6};
    Integer[] arr2 = new Integer[]{5, 6, 7, 8};

    List<Integer> list = new ArrayList<>();
    list.addAll(new HashSet<>(Arrays.asList(arr1)));
    list.addAll(new HashSet<>(Arrays.asList(arr2)));

    System.out.println(
            list.stream()
                    .collect(groupingBy(identity(), counting()))
                    .entrySet().stream()
                    .filter(i -> i.getValue() == 1)
                    .map(i -> i.getKey())
                    .collect(toList())
    );

修改 在一个列表问题中将此答案更改为地址倍数。

答案 3 :(得分:1)

使用HashSet,出于教育目的,如果列表很大,这可能会非常快:

  public static void main(final String[] args) {
    final List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
    final Set<Integer> set1 = new HashSet<>(list1);

    final List<Integer> list2 = new ArrayList<>(Arrays.asList(5, 6, 7, 8));
    final Set<Integer> set2 = new HashSet<>(list2);

    set1.retainAll(set2); // Keep union.

    // Remove union to keep only unique items.
    list1.removeAll(set1);
    list2.removeAll(set1);

    // Accumulate unique items.
    list1.addAll(list2);

    System.out.println(new HashSet<>(list1));
    // [1,2,3,4,7,8]
  }

答案 4 :(得分:0)

你必须添加第二个for循环来检查arr2的元素是否在arr1中,因为你只检查arr1的元素是否在arr2中

public static void main(String[] args) {
        // TODO Auto-generated method stub

        int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
        int[] arr2 = new int[] { 5, 6, 7, 8 };

        boolean contains = false;
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < arr1.length; i++) {
            for (int j = 0; j < arr2.length; j++) {
                if (arr1[i] == arr2[j]) {
                    contains = true;
                    break;
                }
            }

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

            if(!contains){
                list.add(arr2[i]);
            }
            else{
                contains = false;
            }
        }
        System.out.println(list);

    }

答案 5 :(得分:0)

更优化的方法是使用列表迭代器。

        int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
        int[] arr2 = new int[] { 5, 6, 7, 8 };

        List<Integer> list1 = IntStream.of(arr1).boxed().collect(Collectors.toList());
        List<Integer> list2 = IntStream.of(arr2).boxed().collect(Collectors.toList());

        Iterator list1Iter = list1.iterator();
        boolean contains = false;
        while(list1Iter.hasNext()) {
            int val1 = (int)list1Iter.next();
            Iterator list2Iter = list2.iterator();
            while(list2Iter.hasNext()) {
                int val2 = (int)list2Iter.next();
                if( val1 == val2) {
                    // remove duplicate
                    list1Iter.remove();
                    list2Iter.remove();
                }
            }
        }
        list1.addAll(list2);
        for( Object val : list1) {
            System.out.println(val);
        }

如果您使用的是Java 8,则可以执行以下操作:

List resultList = list1.stream().filter(nbr ->  !list2.contains(nbr)).collect(Collectors.toList());
resultList.addAll(list2.stream().filter(nbr -> !list1.contains(nbr)).collect(Collectors.toList()));

答案 6 :(得分:0)

import java.util.Scanner;
import java.io.*;


public class CandidateCode{
    static int count =0;
    public static void main(String args[])
    {

    int n,n1;
    Scanner sc=new Scanner(System.in);
    System.out.println("Enter no. of elements for first array");
    n=sc.nextInt();
    int arr[]=new int[n];
    System.out.println("Enter the elements of first array");
    for(int i=0;i<n;i++)
    {
        arr[i]=sc.nextInt();

    }
    System.out.println("Enter no. of elements for second array");
    n1=sc.nextInt();
    int arr1[]=new int[n1];
    System.out.println("Enter the elements of second array");
    for(int i=0;i<n1;i++)
    {
        arr1[i]=sc.nextInt();

    }
    unique_ele(arr,arr1);
    unique_ele(arr1,arr);
    System.out.println("The number of unique elements are");
    System.out.println(count);
    }
    public static int unique_ele(int arr2[],int arr3[])
    {
        boolean contains = false;
        for(int i=0;i<arr2.length;i++)
        {
            for(int j=0;j<arr3.length;j++)
            {
                if (arr2[i] == arr3[j]) {
                    contains = true;
                    break;
                }            

            }
             if(!contains){
               count++;
            }
            else{
                contains = false;
            }
        }

        return count;    
    }

}

答案 7 :(得分:0)

public static ArrayList<Integer> findUniqueAmongLists(ArrayList<Integer> a, ArrayList<Integer> b){
        ArrayList<Integer> uniqueArr = new ArrayList<>();
        ArrayList<Integer> duplicateArr = new ArrayList<>();
        for(int i=0; i< a.size(); i++){
            if(!duplicateArr.contains(a.get(i))){
                uniqueArr.add(a.get(i));
                duplicateArr.add(a.get(i));
            }
            else{
                uniqueArr.remove(a.get(i));
            }
        }
        for(int j=0; j< b.size(); j++){
            if(!duplicateArr.contains(b.get(j))){
                uniqueArr.add(b.get(j));
                duplicateArr.add(b.get(j));
            }
            else{
                uniqueArr.remove(b.get(j));
            }
        }
        return uniqueArr;
    }

答案 8 :(得分:0)

int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
    int[] arr2 = new int[] { 5, 6, 7, 8 };

    boolean contains = false;
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < arr1.length; i++) {
        for (int j = 0; j < arr2.length; j++) {
            if (arr1[i] == arr2[j]) {
                contains = true;
                break;
            }

        }

        if (!contains) {
            list.add(arr1[i]);

        } else {
            contains = false;
        }
    }

    for (int j = 0; j < arr2.length; j++) {
        for (int k = 0; k < arr1.length; k++) {
            if (arr2[j] == arr1[k]) {
                contains = true;
                break;
            }

        }
        if (!contains) {

            list.add(arr2[j]);
        } else {
            contains = false;
        }
    }
    System.out.println(list);
}

答案 9 :(得分:0)

实际上,有一个使用Java TreeSet的更简单的解决方案。javaTreeSet不包含重复的元素。因此,您要做的就是创建一个TreeSet并将所有元素添加到其中。它也保持自然秩序。

public static void main(String[] args) {
    int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
    int[] arr2 = new int[] { 5, 6, 7, 8 };
    TreeSet<Integer> set = new TreeSet<>();
    for (int i:arr1) {
        set.add(i);
    }
    for (int i:arr2) {
        set.add(i);
    }
    System.out.println(set);
}

输出:[1、2、3、4、5、6、7、8]

答案 10 :(得分:0)

public class UniqueElementFrom2array {

    public static void main(String[] args) 
    {      
      int[] a= {1,2,3,4,5,6,7};
      int[] b= {1,2,3,8,9,4,10,11,12};
      int[] c=new int[a.length+b.length];
        int len1=a.length;
        int len2=b.length;
        System.arraycopy(a, 0, c, 0, len1);
        System.arraycopy(b, 0, c, len1,len2);
        Arrays.sort(c);
        System.out.println(Arrays.toString(c));
        Set s=new HashSet();
        
    for(int i=0;i<c.length;i++)
    {
        if(!s.contains(c[i]))
        {
            s.add(c[i]);
            System.out.print(c[i] + " "); 
        }
    }
    }
}