请选择 进入手机版 | 继续访问电脑版

[java] java8怎样 用Stream查List对象某属性是否有重复

[复制链接]
查看55 | 回复9 | 2021-9-13 02:44:31 | 显示全部楼层 |阅读模式
目次

利用 Stream查List对象某属性是否有重复

Java8开辟 中,针对List对象集合,常必要 判定 某个属性是否存在重复值。用Stream流处理能方便的得到效果 。

训练 一下stream的一些用法

测试示例Java代码

  1. @Test
  2. public void t2() {
  3. List<User> list = new ArrayList<>();
  4. User user1 = new User("zhangsan", "beijing", 30);
  5. User user2 = new User("zhangsan", "beijing", 40);
  6. User user3 = new User("lisi", "shanghai", 35);
  7. User user4 = new User("lisi", "shanghai", 28);
  8. User user5 = new User("lisim", "shanghai", 32);
  9. list.add(user1); list.add(user2);list.add(user3); list.add(user4);list.add(user5);
  10. System.out.println("原始数据:"+list);
  11. //判断姓名是否有重复,练习使用java8的stream方法
  12. //方法1. distinct, 直接比较大小,只知道是否有重复
  13. List<String> collect1 = list.stream().map(User::getName).distinct().collect(Collectors.toList());
  14. System.out.println(collect1.size()!=list.size()?"方法1-姓名有重复":"无重复");
  15. //方法2.用户姓名计数
  16. Map<Object, Long> collect2 = list.stream().collect(
  17. Collectors.groupingBy( User::getName , Collectors.counting() ) );
  18. System.out.println("姓名重复计数情况:"+collect2);
  19. //筛出有重复的姓名
  20. List<Object> collect3 = collect2.keySet().stream().
  21. filter(key -> collect2.get(key) > 1).collect(Collectors.toList());
  22. //可以知道有哪些姓名有重复
  23. System.out.println("方法2-重复的姓名 : "+collect3);
  24. //方法3,对重复的姓名保留计数
  25. List<Map<String, Long>> collect4 = collect2.keySet().stream().
  26. filter(key -> collect2.get(key) > 1).map(key -> {
  27. Map<String, Long> map = new HashMap<>();
  28. map.put((String) key, collect2.get(key));
  29. return map;
  30. }).collect(Collectors.toList());
  31. System.out.println("方法3-重复的姓名及计数:"+collect4);
  32. }
复制代码

运行效果 ,方便验证是否是必要 的样子。

  1. 原始数据:[User(name=zhangsan, address=beijing, age=30), User(name=zhangsan, address=beijing, age=40), User(name=lisi, address=shanghai, age=35), User(name=lisi, address=shanghai, age=28), User(name=lisim, address=shanghai, age=32)] 方法1-姓名有重复姓名重复计数情况:{lisi=2, zhangsan=2, lisim=1} 方法2-重复的姓名 : [lisi, zhangsan] 方法3-重复的姓名及计数:[{lisi=2}, {zhangsan=2}]
复制代码

list的五种去重方式

口试 中常常 被问到的list怎样 去重,一样平常 是口述,不必要 代码表现 ,这个时间 ,头脑 肯定 要清楚 ,可以摆列 出集中去重的方法,以显现 你对list数据布局 ,以及干系 方法的把握 ,表现 你的java基础学的是否牢固

下面,我就将五种方法逐一显现

新建一个list数组:

  1. List list = new ArrayList();
  2. list.add(26);
  3. list.add(39);
  4. list.add(39);
  5. list.add(39);
  6. list.add(39);
  7. list.add(5);
  8. list.add(40);
  9. list.add(39);
  10. list.add(25);
  11. System.out.println(list);
复制代码

方法一:利用 java8新特性stream举行 List去重

  1. List newList = list.stream().distinct().collect(Collectors.toList());
  2. System.out.println(“java8新特性stream去重:”+newList);
  3. list.add(39);
复制代码

方法二:双重for循环去重

  1. for (int i = 0; i < list.size(); i++) {
  2. for (int j = 0; j < list.size(); j++) {
  3. if(i!=j&&list.get(i)==list.get(j)) {
  4. list.remove(list.get(j));
  5. }
  6. }
  7. }
复制代码

上面的方法研究后,确实有点小题目 ,下面放上优化后的方法(不保举 利用 ,速率 太慢)

  1. for (int i = 0; i < list.size(); i++) {
  2. for (int j = 0; j < list.size(); ) {
  3. // System.out.println(i+"-"+list.get(i)+"-"+j+"!!!!"+list.get(j));
  4. if (i != j && list.get(i) == list.get(j)) {
  5. // System.out.println(j+":"+list.get(j));
  6. list.remove(j);
  7. } else {
  8. j++;
  9. }
  10. }
  11. }
  12. System.out.println(“双重for循环去重:”+list);
  13. list.add(39);
复制代码

方法三:set集合判定 去重,不打乱次序

  1. Set set1 = new HashSet();
  2. List newList1 = new ArrayList();
  3. for (Integer integer : list) {
  4. if(set1.add(integer)) {
  5. newList1.add(integer);
  6. }
  7. }
  8. System.out.println(“set集合判断去重:”+list);
  9. list.add(39);
复制代码

方法四:遍历后判定 赋给另一个list集合

  1. List newList2 = new ArrayList();
  2. for (Integer integer : list) {
  3. if(!newList2.contains(integer)){
  4. newList2.add(integer);
  5. }
  6. }
  7. System.out.println(“赋值新list去重:”+newList2);
  8. list.add(39);
复制代码

方法五:set和list转换去重

  1. Set set2 = new HashSet();
  2. List newList3 = new ArrayList();
  3. set2.addAll(list);
  4. newList3.addAll(set2);
  5. System.out.println(“set和list转换去重:”+newList3);
复制代码

以上为个人履历 ,渴望 能给大家一个参考,也渴望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 山东大鲤鱼 | 2021-9-17 14:53:33 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

avatar 春天到了 | 2021-9-21 22:15:44 | 显示全部楼层
支持一下,下面的保持队形!
回复

使用道具 举报

avatar 何幕之之rl | 2021-9-24 06:48:46 | 显示全部楼层
今天的心情很不错啊
回复

使用道具 举报

avatar 韭菜555 | 2021-10-3 17:45:39 | 显示全部楼层
投admin楼主一票,不用谢哦!
回复

使用道具 举报

avatar joneluz | 2021-10-9 02:31:27 | 显示全部楼层
顶一下,收藏了!
回复

使用道具 举报

avatar dw3995 | 2021-10-9 16:43:20 | 显示全部楼层
学习雷锋,好好回帖!
回复

使用道具 举报

avatar 王建新1 | 2021-10-9 17:35:24 | 显示全部楼层
admin楼主给脑残下了定义!
回复

使用道具 举报

最近回了很多帖子,都没人理我!
回复

使用道具 举报

好无聊啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则