簡體   English   中英

Java - 在兩個不同的 arrays 中查找唯一元素

[英]Java - Finding unique elements in two different arrays

我需要在兩個不同的 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]作為 output。 但預期的 output 是[1,2,3,4,7,8] 我不確定我在這里做錯了什么。 我需要它以傳統的方式。 我不想使用任何內置方法來實現這一點。

注意:我覺得它不是重復的,因為提供的解決方案不是在兩個 arrays 上找到唯一元素。

這解決了你的問題:

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);
    }
}

出於教育目的使用 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]
  }

實際上,使用 Java TreeSet 有一個更簡單的解決方案。java TreeSet 不包含重復元素。 因此,您所要做的就是創建一個 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]

如果您使用的是 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]

為了解決這個問題,我根據這篇文章: 識別列表中的重復項

這里是另一個流(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())
    );

編輯:將此答案更改為解決一個列表問題中的倍數。

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

您必須添加第二個 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);

    }

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

        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()));
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;    
    }

}
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;
    }
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);
}
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] + " "); 
        }
    }
    }
}

java中使用TreeSet的完整代碼。

import java.util.*;
import java.util.Scanner;
public class Main
{
    public static void uniqElements(int arr1[], int arr2[],int n){
        TreeSet<Integer> set1 = new TreeSet<>();
        TreeSet<Integer> set2 = new TreeSet<>();
        TreeSet<Integer> set3 = new TreeSet<>();
        TreeSet<Integer> set4 = new TreeSet<>();
        for (int i:arr1) {
            set1.add(i);
            set3.add(i);
        }
        for (int i:arr2) {
            set2.add(i);
            set4.add(i);
        }
        set3.addAll(set4);
        set1.retainAll(set2);
        set3.removeAll(set1);
        System.out.println(set3);
    
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr1 = new int[n];
        int[] arr2 = new int[n];
        for(int i =0;i<n;i++){
            arr1[i]=sc.nextInt();
        }
        for(int i =0;i<n;i++){
            arr2[i]=sc.nextInt();
        }
        uniqElements(arr1,arr2,n);
    
    }
}
    public static void main(String[] args) {
        int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
        int[] arr2 = new int[] { 5, 6, 7, 8 };
        System.out.println(Stream.concat(Arrays.stream(arr1).boxed(), Arrays.stream(arr2).boxed()).distinct().collect(Collectors.toList()));
}
  1. 合並所有數組。
  2. 刪除包含第二個數組值的合並數組中的元素。
import java.util.TreeSet;

public class ArrayUnique {
    public static void getUniqueElements(int arr1[], int arr2[]){

        // Merge all array with treeset 
        // it will remove duplicate element

        TreeSet<Integer> all= new TreeSet<>();
        TreeSet<Integer> secondArray= new TreeSet<>();
        
        for(int i:arr1){
            all.add(i);
        }
        for(int i:arr2){
            all.add(i);
            secondArray.add(i);
        }

        //Delete element that contains secondArray value
        all.removeAll(secondArray);

        //print to console
        System.out.println(all);
    }


    public static void main(String[] args) {
        
         int[] arr1 = {1,2,3,4};
         int[] arr2 = {1,3,5,10,16};
         getUniqueElements(arr1,arr2);

         //Result: [2,4]
    
    }
}


嘗試這個:

    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 };
    List<Integer> list = Stream.concat(Arrays.stream(arr1).boxed(), Arrays.stream(arr2).boxed()).distinct().collect(Collectors.toList());
    System.out.println(list);

}

希望這能解決問題。

這將為您提供兩個 arrays 的唯一值;

public static String[] uniqueArr(String[] names1, String[] 
names2) 
{
Set<String> set = new HashSet<>(new
LinkedList<>(Stream.of(names1,
names2).flatMap(Stream::of).collect(Collectors.toList())));
String[] arr = new String[set.size()];
set.toArray(arr);
return arr;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM