在下面的代码中,我有一个包含重复值的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]
问题是我不希望对值进行排序。有什么办法可以删除重复项而无需重新排序
答案 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]