2017-02-04 7 views
0

У меня возникли проблемы с удалением дубликатов из двух массивов, которые были объединены в один. Я написал следующий код, который объединяет массивы, но я не уверен, как удалить дубликаты из окончательного массива. Предположим, что массивы уже отсортированы.Объединить два массива и удалить дубликаты в Java

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; 
} 
+0

удалить их перед слиянием. –

+0

Я не знаю, каков контекст проблемы или насколько важно использование/скорость использования вашей программы, но вы должны начать использовать коллекции. Вы можете сделать все это в одной или двух строках. – MikaelF

ответ

0

Хорошо, кто-то ненавидел все ответы. Вот еще одна попытка, которая объединяет два stackoverflow q's, 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 
+0

Этот ответ не учитывает тот факт, что пользователь объединяет два отсортированных массива и хочет сохранить сортировку. –

-1

Назовите метод слияния и выполните следующие действия. Я протестировал его. Он работает нормально.

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

`

0

Вы можете использовать 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)); 
    } 
} 
0
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] 

 Смежные вопросы

  • Нет связанных вопросов^_^