2017-04-07 102 views
1

我想从Java中的数组中删除每个重复项,并将剩余的整数存储在同一个数组中。如何删除数组中的所有重复项

例如:int [] = {5,5,5,3,4,4,2,2,1}; ==> int [] = {3,1};

到目前为止,我已经尝试使用:

Set<Integer> set = new HashSet<Integer>(); 

for (int i = 0; i < array.length; i++) { 
    set.add(array[i]); 
} 

看起来虽然,这只是删除重复的一个而不是两个。

任何帮助,将不胜感激。

+0

的可能的复制[获得从在Java ArrayList中唯一值](http://stackoverflow.com/questions/13429119/get-unique-values-from-arraylist -in-java) – Okapist

+0

@Marc H.我编辑了我的代码,你可以测试一下。 – Alekhya

+0

请添加更多的上下文。您现在所显示的是一个循环,它将元素添加到集合中。那又怎么样? – Arkadiy

回答

0

这应该工作:

INT []数组= {5,5,5,3,4,4,2,2,1};

Arrays.sort(array); 
Set<Integer> set = new HashSet<Integer>(); 

Set<Integer> duplicateSet = new HashSet<Integer>(); 

for (int i = 0; i < array.length; i++) { 

    if(!set.add(array[i])){ 
     duplicateSet.add(array[i]); 
    } 
} 


System.out.println(duplicateSet.toString()); 
set.removeAll(duplicateSet); 
System.out.println(set.toString()); 

输出:

[1,3] 
+4

如果有奇数的重复项,这将不起作用 – prasanth

+0

我编辑了我的代码。 – Alekhya

0

您可以使用HashMap,维护每个元素的数量并删除那些具有元素计数大于1

public int[] removeDuplicates(int[] arr) { 
    Map<Integer, Integer> countMap = new LinkedHashMap<>(); // To maintain the order 
    for (int n : arr) { 
     Integer count = countMap.get(n); 
     if (count == null) { 
     count = 0; 
     } 
     count++; 
     countMap.put(n, count); 
    } 

    for(Iterator<Map.Entry<String, String>> it = countMap.entrySet().iterator(); it.hasNext();) { 
     Map.Entry<String, String> entry = it.next(); 
     if (entry.getValue() > 1) { 
     it.remove(); 
     } 
    } 

    return new ArrayList<>(countMap.keySet()).toArray(new int[0]); 
} 
0

你不即使是一套,也非常简单,将数组转换为列表,然后使用Collections.frequency检查重复项,如下所示:

Integer[] array = { 5,5,5,3,4,4,2,2,1}; 
    List<Integer> listInputs = Arrays.asList(array); 
    List<Integer> listOutputs = new ArrayList<>(); 
    for(int value : listInputs) { 
     if(Collections.frequency(listInputs, value) ==1) { 
      listOutputs.add(value); 
     } 
    } 
    System.out.println(listOutputs); 

OUTPUT:[3,1]

+0

感谢您的回答。可悲的是我总是收到以下警告:类型列表不是通用的;它不能使用参数进行参数化

+0

您是否使用过上述更新后的代码? – developer

+0

这是个好主意。但'Collections.frequency()'有一个'O(n)'的运行时间,这是坏的。这段代码的总运行时间为'O(n^2)'。 – prasanth