【问题标题】:Merge two arrays and remove duplicates in Java合并两个数组并删除Java中的重复项
【发布时间】:2017-06-22 01:35:51
【问题描述】:

我无法从已合并为一个的两个数组中删除重复项。我编写了以下合并数组的代码,但我不确定如何从最终数组中删除重复项。假设数组已经排序。

public static int[] merge(int[] list1, int[] list2) {
    int[] result = new int[list1.length + list2.length];

    int i = 0;
    int j = 0;

    for (int k = 0; k < (list1.length + list2.length); k++) {
        if (i >= list1.length) {
            result[k] = list2[j];
            j++;
        } 
        else if (j >= list2.length) {
            result[k] = list1[i];
            i++;
        } 
        else {
            if (list1[i] < list2[j]) {
                result[k] = list1[i];
                i++;
            } else {
                result[k] = list2[j];
                j++;
            }
        }
    }
    return result;
}

【问题讨论】:

  • 在合并前删除它们。
  • 我不知道问题的背景是什么,或者你的程序的内存使用/速度有多重要,但你应该开始使用集合。您可以用一两行代码完成所有这些操作。

标签: java arrays merge duplicates


【解决方案1】:

调用您的merge 方法并执行以下操作。我测试了它。它工作正常。

int[] result = merge(count, count1);

Set<Integer> set = new HashSet<Integer>();
try {
    for (int i = 0; i < result.length; i++) {
        set.add(result[i]);
    }
    System.out.println(set);
} catch (Exception e) { }

【讨论】:

    【解决方案2】:

    好吧,有人讨厌所有的答案。这是结合两个stackoverflow q的另一个尝试,combining arrays和removing dupes.

    这个比我之前在两个一百万个整数列表上的尝试快很多。

    public int[] mergeArrays2(int[] arr1, int[] arr2){
        int[] merged = new int[arr1.length + arr2.length];
        System.arraycopy(arr1, 0, merged, 0, arr1.length);
        System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);
    
        Set<Integer> nodupes = new HashSet<Integer>();
    
        for(int i=0;i<merged.length;i++){
            nodupes.add(merged[i]);
        }
    
        int[] nodupesarray = new int[nodupes.size()];
        int i = 0;
        Iterator<Integer> it = nodupes.iterator();
        while(it.hasNext()){
            nodupesarray[i] = it.next();
            i++;
        }
    
    
    
        return nodupesarray;
    }
    

    控制台输出:

    INFO [main] (TestMergeArray.java:40) - creating two lists of a million ints
    DEBUG [main] (TestMergeArray.java:41) - list 1 size : 1000000
    DEBUG [main] (TestMergeArray.java:42) - list 2 size : 1000000
    INFO [main] (TestMergeArray.java:56) - now merging
    INFO [main] (TestMergeArray.java:59) - done, final list size is 864975
    

    【讨论】:

    • 这个答案没有考虑到用户正在合并两个排序数组并希望保持排序的事实。
    【解决方案3】:

    你可以使用 ArrayLists 吗? ArrayLists 将使这很容易做到。

     //Consider n1 to be some global or instance variable.
    
     import java.util.ArrayList;
     public void Add(ArrayList<Integer> n2) {
    
         for(int i = 0; i < n2.size(); i++) {
             if(!n1.contains(i))
                 n1.add(n2.get(i));
         }
    }
    

    【讨论】:

      【解决方案4】:
      package com.string.merge;
      
      import java.util.ArrayList;
      
      public class MergeArrayAndRemoveDuplicate {
          public static void main(String[] args) {
              int[] a = {1, 2, 2, 3, 1, 5, 3};
              int[] b = {4, 3, 1, 5, 7, 8, 4, 2};
      
              ArrayList<Integer> l = new ArrayList<>();
              for (int i = 0; i < (a.length > b.length ? a.length : b.length); i++) {
                  if (i < a.length) {
                      int c = 0;
                      while (c <= l.size()) {
                          if (l.contains(a[i]) == false) {
                              l.add(a[i]);
                          }
                          c++;
                      }
                  }
                  if (i < b.length) {
                      int c = 0;
                      while (c <= l.size()) {
                          if (l.contains(b[i]) == false) {
                              l.add(b[i]);
                          }
                          c++;
                      }
                  }
              }
              System.out.println(l);
          }
      }
      
      o/p-[1, 4, 2, 3, 5, 7, 8]
      

      【讨论】:

        【解决方案5】:
        import java.util.ArrayList;
        import java.util.List;
        public class MergeListAndRemoveDuplicate {
            public static void main(String[] args) {
                int a[] = {1, 1, 2, 1, 3, 4, 1, 2, 5};
                int b[] = {1, 2, 3, 1, 3, 2, 4, 5, 6, 7};
        
                boolean flag = true;
                List<Integer> list = new ArrayList<Integer>();
        
                for (int i = 0; i < a.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (a[i] == b[j]) {
                            flag = false;
                        }
                        if (i == j && !list.contains(b[j])) {
                            list.add(b[j]);
                        }
                    }
                    if (flag == true) {
                        list.add(a[i]);
                    }
                }
                System.out.println(list);
            }
        }
        

        【讨论】:

          【解决方案6】:

          这是一种仅对数组进行一次迭代并且不使用散列来检测重复项的技术。

          import java.util.List;
          import java.util.ArrayList;
          import java.util.Arrays;
          
          public class SortedMerge {
              public static int[] merge(int[] array1, int[] array2) {
                  int[] a;
                  int[] b;
                  List<Integer> c = new ArrayList<Integer>();
                  int i = 0;
                  int j = 0;
          
                  // b is longer than a
                  if (array1.length > array2.length) {
                      a = array2;
                      b = array1;
                  } else {
                      a = array1;
                      b = array2;
                  }
          
                  while (j < b.length) {
                      int bb = b[j];
          
                      if (i < a.length) {
                          int aa = a[i];
          
                          if (aa > bb) {
                              c.add(bb);
                              j++;
                          } else {
                              c.add(aa);
                              i++;
                              if (aa == bb) {
                                  j++;
                              }
                          }
                      } else {
                          c.add(bb);
                          j++;
                      }
                  }
                  // java 8 List<Integer> to int[]
                  return c.stream().mapToInt(Integer::intValue).toArray();
              }
          
              public static void main(String[] args) throws Exception {
                  int[] array1 = new int[]{3, 5, 8, 11, 14};
                  int[] array2 = new int[]{1, 2, 3, 4, 6, 8, 14, 15, 17};
                  int[] c = merge(array1, array2);
          
                  for (int i = 0; i < c.length; i++) {
                      System.out.format("%d,", c[i]);
                  }
                  System.out.println();
                  // output> 1,2,3,4,5,6,8,11,14,15,17,
              }
          }
          

          【讨论】:

            【解决方案7】:

            这种更清晰的 lambda 解决方案由于(取消)装箱而稍微慢了一点
            需要 Java 8 或更高版本

            public static int[] mergedistinct( int[] array1, int[] array2 ) {
              Stream<Integer> s1 = IntStream.of( array1 ).boxed();
              Stream<Integer> s2 = IntStream.of( array2 ).boxed();
              return( Stream.concat( s1, s2 ).distinct().mapToInt( i -> i ).toArray() );
            }
            

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

            如果你需要对数组进行排序:

            …
            return( Stream.concat( s1, s2 ).distinct().sorted().mapToInt( i -> i ).toArray() );
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-05-25
              • 2010-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多