List去除重复数据(保留顺序)的两种简便方式

偶然看到了一些比较有意思的文章,记录一下:

1.使用LinkedHashSet删除arraylist中的重复数据

LinkedHashSet是在一个ArrayList删除重复数据的最佳方法。LinkedHashSet在内部完成两件事:

  • 删除重复数据

  • 保持添加到其中的数据的顺序

Java示例使用LinkedHashSet删除arraylist中的重复项。在给定的示例中,numbersList是包含整数的arraylist,其中一些是重复的数字。

例如1,3和5.我们将列表添加到LinkedHashSet,然后将内容返回到列表中。结果arraylist没有重复的整数。

    @Test
    public void testLinkedHashSet(){
        List<Integer> numberList = new ArrayList<>(Arrays.asList(2, 1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7));
        System.out.println(numberList);
        LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>(numberList);
        ArrayList<Integer> withoutDuplicateList = new ArrayList<>(linkedHashSet);
        System.out.println(withoutDuplicateList);
    }

 

2.使用java8新特性stream进行List去重

要从arraylist中删除重复项,我们也可以使用java 8 stream api。使用steam的distinct()方法返回一个由不同数据组成的流,通过对象的equals()方法进行比较。

收集所有区域数据List使用Collectors.toList()。

Java程序,用于在不使用Set的情况下从java中的arraylist中删除重复项。

    @Test
    public void testStream(){
        List<Integer> numberList = new ArrayList<>(Arrays.asList(2, 1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7));
        System.out.println(numberList);
        List<Integer> distinctList = numberList.stream().distinct().collect(Collectors.toList());
        System.out.println(distinctList);
    }

总结:单从代码来看使用LinkedHashSet的代码相对多一点,这个主要是因为stream的流式方法看上去更简洁,但是测试结果显示第二种耗时是第一种的十几倍,从代码也能大致看到,第一种类似空间换时间的策略,在内存不是那么缺的时候建议还是使用第一种。

原文见:https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247495026&idx=2&sn=9a63afc82ac41525d903eadb005ac699&chksm=9beecc00ac994516e58e23ddd80f44df188ecf8d3c970bf349f157572a64a7d6efe2c1a50bd2&mpshare=1&scene=1&srcid=1119SH0KjtyOCsyVROvB1S2Q&sharer_sharetime=1605752871732&sharer_shareid=43ff4c7fee7f245bbb910e1f473a5785&key=6b64641f420daf84b0065a0da10e4fc3a99b99733c7a93c0f5c41600a943a1334b6b6c4d6193deb2243baf408cb61e0076ce030fba37d6d85673b3192cd8fe5b0ce7393742fb4dd55c66ab7ad994e05bbc24461ed846b8bf4b7ad9a26b3ea333689294ec62198547f38b762dd487e78a8a95a6e4f683ab17e370e87f5a91ddaa&ascene=1&uin=Mjc1OTAyODQzNQ%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=AX7UCRd4K8DDHzO7HPKVtQ8%3D&pass_ticket=jPHWj5%2FCmOfXVO0arJnMeqwgI5TQ2fx298Mffdtbim5LBIV32kQ1Sp1Itc2FsUSL&wx_header=0

### 回答1: 可以使用Java 8中的Stream API的distinct()方法来实现去重。例如,假设我们有一个字符串列表,我们可以使用以下代码来去重并打印每个唯一的字符串: ``` List<String> stringList = Arrays.asList("apple", "banana", "apple", "orange", "banana"); stringList.stream().distinct().forEach(System.out::println); ``` 输出结果为: ``` apple banana orange ``` 在这个例子中,我们使用了Stream API的distinct()方法来去重字符串列表,并使用forEach()方法打印每个唯一的字符串。 ### 回答2: 使用Java Stream去重可以通过使用distinct()方法来实现。distinct()方法是Stream接口的一个中间操作,它会返回一个去重后的新Stream,该新Stream不包含重复的元素。 示例代码如下: List<Integer> numbers = Arrays.asList(1, 2, 3, 3, 4, 5, 5); List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList()); 在上述代码中,我们有一个整型的List,其中包含了一些重复的数字。通过使用stream()方法,我们可以将List转换为Stream,然后使用distinct()方法去重,最后通过collect(Collectors.toList())方法将去重后的Stream转换为List。 输出结果为:[1, 2, 3, 4, 5],可以看到去重后的List中只包含了不重复的数字。 需要注意的是,distinct()方法会根据元素的hashCode()和equals()方法来进行去重。所以,如果我们在自定义类中需要去重,需要确保重写了hashCode()和equals()方法。 另外,如果想要对自定义类的多个字段进行去重,可以使用如下方式List<Person> people = new ArrayList<>(); List<Person> distinctPeople = people.stream().distinct().collect(Collectors.toList()); 在这个例子中,我们使用了自定义的Person类。如果希望根据Person对象的多个字段进行去重,就需要在Person类中重写hashCode()和equals()方法,确保根据多个字段的值来判断两个对象是否相同。 ### 回答3: Java Stream是Java 8及以上版本引入的一种新的数据处理方式。在Java Stream中去重操作可以通过使用distinct()方法来实现。 通过调用Stream的distinct()方法,可以返回一个去重后的新的Stream。该方法使用元素的equals()方法来确定元素是否重复,从而保留唯一的元素并删除重复的元素。 以下是一个示例代码: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class RemoveDuplicates { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 3, 2, 1); List<Integer> distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); System.out.println(distinctNumbers); // 输出结果:[1, 2, 3, 4] } } ``` 在以上代码中,我们创建了一个包含重复元素的List,并通过Stream的distinct()方法去除重复的元素,最后将去重后的结果收集到一个新的List中打印出来。 需要注意的是,distinct()方法依赖元素的equals()方法来判断元素是否相等,因此在自定义类的情况下需要重写equals()方法。此外,distinct()方法是没有顺序保证的,如果希望保留顺序,则可以使用LinkedHashSet来实现。 以上就是使用Java Stream进行去重操作的方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值