如何在不重新排序的情况下返回列表中的唯一值

时间:2018-07-30 14:29:38

标签: java

在下面的代码中,我有一个包含重复值的arraylist:

List<Double> fitnesses = new ArrayList<Double>();
fitnesses.add(5.0);
fitnesses.add(1.0);
fitnesses.add(5.0);
fitnesses.add(2.0);
fitnesses.add(4.0);
fitnesses.add(2.0);

我要删除重复项,为此,我使用了以下内容:

Set<Double> hashsetList = new HashSet<Double>(fitnesses);

问题是我得到的输出是:

[1.0, 2.0, 4.0, 5.0]

问题是我不希望对值进行排序。有什么办法可以删除重复项而无需重新排序

5 个答案:

答案 0 :(得分:5)

您可以使用具有不同属性的流。
distinct()是在Java 8中添加的流功能

注意:如果使用的是Java8

List<Double> distinctList = fitnesses.stream().distinct().collect(Collectors.toList());

注意:在JAVA8之前

Set<Double> uniqueRecords = new LinkedHashSet<Double>();
for (Double value : fitnesses){
    uniqueRecords.add(value);
}
System.out.println(uniqueRecords);

或者我们使用:

Set<Double> uniqueRecords = new LinkedHashSet<Double>(fitnesses); 

输出= [5.0、1.0、2.0、4.0]

答案 1 :(得分:4)

如果您不想/不能使用Java 8方法,则可以将值插入LinkedHashSet中,这样可以保留插入顺序。

答案 2 :(得分:1)

您可以使用Java 8流和distinct命令来实现:

List<Double> collect = fitnesses.stream()
                                .distinct() //this is where the magic happens
                                .collect(Collectors.toList());

输出:

  

[5.0、1.0、2.0、4.0]

答案 3 :(得分:1)

在J8中,另一个答案是最有效的:

List<Double> collect = fitnesses.stream()
                            .distinct() 
                            .collect(Collectors.toList());

如果您不是Java 8,也可以使用java.util.LinkedHashSet

Set<Double> hashsetList = new LinkedHashSet<Double>(fitnesses);

LinkedHashSet将保留添加元素的顺序

答案 4 :(得分:1)

使用LinkedHashSet似乎可行:

public void test() throws InterruptedException {
    List<Double> fitnesses = new ArrayList<Double>();
    fitnesses.add(5.0);
    fitnesses.add(1.0);
    fitnesses.add(5.0);
    fitnesses.add(2.0);
    fitnesses.add(4.0);
    fitnesses.add(2.0);
    System.out.println("Original: "+fitnesses);
    // Get the unduplicated set.
    Set<Double> hashsetList = new LinkedHashSet<>(fitnesses);
    System.out.println("Deduplicated: "+hashsetList);
}
  

原始:[5.0、1.0、5.0、2.0、4.0、2.0]

     

无重复:[5.0、1.0、2.0、4.0]