17

我有一个数组,说List<Integer> 139, 127, 127, 139, 130

如何删除它的重复项并保持其顺序不变?IE139, 127, 130

4

11 回答 11

27

使用java.util.LinkedHashSet.

Set<Integer> set = new LinkedHashSet<>(list);
于 2013-10-22T07:38:45.007 回答
7

有了这个单行:

yourList = new ArrayList<Integer>(new LinkedHashSet<Integer>(yourList))
于 2013-10-22T07:39:58.153 回答
3

没有LinkedHashSet开销(HashSet用于看到的元素,而不是稍微快一点):

List<Integer> noDuplicates = list
        .stream()
        .distinct()
        .collect(Collectors.toList());

请注意,订单由Stream.distinct()合约保证:

对于有序流,不同元素的选择是稳定的(对于重复元素,会保留在遇到顺序中最先出现的元素。)

于 2020-06-26T08:26:00.283 回答
2

Set从您的列表中构造- “不包含重复元素的集合”:

Set<Integer> yourSet = new HashSet<Integer>(yourList);

并将其转换回您想要的任何内容。

注意:如果要保持顺序,请LinkedHashSet改用。

于 2013-10-22T07:37:25.527 回答
0

用于LinkedHashSet删除重复和维护秩序。

于 2013-10-22T07:38:50.107 回答
0

正如我无法推断的那样,您需要保留插入顺序,即完成@Maroun Maroun 所写的内容,使用 set,但是像 whitch 这样LinkedHashSet<E>的专业实现完全可以满足您的需求。

于 2013-10-22T07:39:43.070 回答
0

有2种方式:

  1. 仅创建具有唯一整数的新列表

    • (与 Maroun Maroun 回答相同)
    • 你可以用 2 个嵌套的 fors 来做到这一点,像这样 O(nn/2):

      List<int> src,dst;
      // src is input list
      // dst is output list
      dst.allocate(src.num); // prepare size to avoid slowdowns by reallocations
      dst.num=0;             // start from empty list
      for (int i=0;i<src.num;i++)
       {
       int e=1;
       for (int j=0;i<dst.num;i++)
        if (src[i]==dst[j]) { e=0; break; }
       if (e) dst.add(src[i]);
       }
      
  2. 您可以选择重复的项目并删除它们... O(2.n) 带有标记的删除

    • 这要快得多,但是您需要整个 int 范围的内存表
    • 如果您使用数字 <0,10000> 那么它将占用 BYTE cnt[10001]
    • 如果您使用数字 <-10000,10000> 那么它将占用 BYTE cnt[20002]
    • 对于像这样的小范围是可以的,但如果你必须使用 32 位范围,它将需要 4GB !
    • 使用位打包,每个值可以有 2 位,所以它只有 1GB,但这仍然对我的口味来说太多了
    • 好的,现在如何检查重复性...

      List<WORD> src;  // src is input list
      BYTE cnt[65536]; // count usage for all used numbers
      int i;
      for (i=0;i<65536;i++) cnt[i]=0; // clear the count for all numbers
      for (i=0;i<src.num;i++)         // compute the count for used numbers in the list  
       if (cnt[src[i]]!=255) 
        cnt[src[i]]++;
      
    • 在此之后任何数字 i 都是重复的 if (cnt[i]>1)
    • 所以现在我们要删除重复的项目(除了一个)
    • 像这样改变cnt []

      for (i=0;i<65536;i++) if (cnt[i]>1) cnt[i]=1; else cnt[i]=0;
      
    • 好的,现在是删除部分:

      for (i=0;i<src.num;i++)         
       if (cnt[src[i]]==1) cnt[src[i]]=2; // do not delete the first time
        else if (cnt[src[i]]==2)          // but all the others yes
         { 
         src.del(i);
         i--;                             // indexes in src changed after delete so recheck for the same index again
         }
      
  3. 您可以将这两种方法结合在一起

  4. 由于列表中的项目移位,从列表中删除项目很慢
    • 但可以通过向项目添加删除标志来加速
    • 而不是删除只是设置标志
    • 并且在标记了所有要删除的项目之后,然后只需立即删除下摆 O(n)

PS。很抱歉使用非标准列表,但我认为如果不评论我,我认为代码是可以理解的,我会回复

聚苯乙烯。与有符号值一起使用时,不要忘记将地址移动一半!

于 2013-10-22T08:08:14.123 回答
0

遍历数组(通过迭代器,而不是 foreach)并删除重复项。使用 set 查找重复项。

或者

遍历数组并将所有元素添加到 LinkedHashSet,它不允许重复并保持元素的顺序。然后清除数组,遍历集合并将每个元素添加到数组中。

于 2013-10-22T07:44:22.647 回答
0

尽管将 ArrayList 转换为 HashSet 可以有效地删除重复项,但如果您需要保留插入顺序,我宁愿建议您使用此变体

// list 是一些字符串列表

   Set<String> s = new LinkedHashSet<String>(list);

然后,如果您需要取回 List 引用,您可以再次使用转换构造函数。

于 2013-10-22T07:50:28.720 回答
0

方法 1:在 Python => 使用集合和列表理解

a= [139, 127, 127, 139, 130]

print(a)
seen =set()
aa = [ch  for ch in a if ch not in seen and not seen.add(ch)]
print(aa)

方法二:

aa = list(set(a))
print(aa)

在 Java 中:使用 Set 并创建一个新的 ArrayList

class t1 {
    public static void main(String[] args) {

int[] a = {139, 127, 127, 139, 130};
List<Integer> list1 = new ArrayList<>();

Set<Integer> set = new LinkedHashSet<Integer>();
for( int ch  : a) {
    if(!set.contains(ch)) {
        set.add(ch);
    }


}//for
set.forEach( (k) -> list1.add(k));
System.out.println(list1);

}
    }
于 2018-05-09T06:12:31.620 回答
0

下面我给出了示例示例,该示例实现了一个通用函数以从 arraylist 中删除重复项并同时保持顺序。

import java.util.*;
public class Main {
    //Generic function to remove duplicates in list and maintain order
    private static <E> List<E> removeDuplicate(List<E> list) {
        Set<E> array = new LinkedHashSet<E>();
        array.addAll(list);
        return new ArrayList<>(array);
    }
    public static void main(String[] args) {
        //Print [2, 3, 5, 4]
        System.out.println(removeDuplicate(Arrays.asList(2,2,3,5, 3, 4)));
        //Print [AB, BC, CD]
        System.out.println(removeDuplicate(Arrays.asList("AB","BC","CD","AB")));
    }
}
于 2017-02-08T07:47:26.723 回答