当前位置: 首页 > news >正文

好的高端网站网站 手机案例

好的高端网站,网站 手机案例,wordpress建站好么,广州十大营销策划公司请直接移步原文Java中List集合对象去重及按属性去重的8种方法 只记录自己喜欢的几种方法 对象元素整体去重的2种方法按照对象属性去重的4种方法 预备数据 public class ListRmDuplicate {private List<String> list;private List<Player> playerList;BeforeEac…

请直接移步原文Java中List集合对象去重及按属性去重的8种方法

只记录自己喜欢的几种方法

  • 对象元素整体去重的2种方法
  • 按照对象属性去重的4种方法

预备数据

public class ListRmDuplicate {private List<String> list;private List<Player> playerList;@BeforeEachpublic void setup() {list = new ArrayList<>();list.add("kobe");list.add("james");list.add("curry");list.add("zimug");list.add("zimug");playerList= new ArrayList<>();playerList.add(new Player("kobe","10000")); //科比万岁playerList.add(new Player("james","32"));playerList.add(new Player("curry","30"));playerList.add(new Player("zimug","27")); // 注意这里名字重复playerList.add(new Player("zimug","18")); //注意这里名字和年龄重复playerList.add(new Player("zimug","18")); //注意这里名字和年龄重复}
}

一、集合元素整体去重

List中的String类型以集合元素对象为单位整体去重。如果你的List放入的是Object对象,需要你去实现对象的equals和hashCode方法,去重的代码实现方法和List去重是一样的

方法一

是大家最容易想到的,先把List数据放入Set,因为Set数据结构本身具有去重的功能,所以再将SET转为List之后就是去重之后的结果。这种方法在去重之后会改变原有的List元素顺序,因为HashSet本身是无序的,而TreeSet排序也不是List种元素的原有顺序

@Test
void testRemove1() {/*Set<String> set = new HashSet<>(list);List<String> newList = new ArrayList<>(set);*///去重并排序的方法(如果是字符串,按字母表排序。如果是对象,按Comparable接口实现排序)//List<String> newList = new ArrayList<>(new TreeSet<>(list));//简写的方法List<String> newList = new ArrayList<>(new HashSet<>(list));System.out.println( "去重后的集合: " + newList);
}
方法二

使用就比较简单,先用stream方法将集合转换成流,然后distinct去重,最后在将Stream流collect收集为List。

@Test
void testRemove2() {List<String> newList = list.stream().distinct().collect(Collectors.toList());System.out.println( "去重后的集合: " + newList);
}

二、按照集合元素对象属性去重

其实在实际的工作中,按照集合元素对象整体去重的应用的还比较少,更多的是要求我们按照元素对象的某些属性进行去重。
看到这里请大家回头去看一下上文中,构造的初始化数据playerList,特别注意其中的一些重复元素,以及成员变量重复。

方法一

为TreeSet实现Comparator接口,如果我们希望按照Player的name属性进行排序,就去在Comparator接口中比较name。下文中写了两种实现Comparator接口方法:

  • lambda表达式:(o1, o2) -> o1.getName().compareTo(o2.getName())
  • 方法引用:Comparator.comparing(Player::getName)
@Test
void testRemove5() {//Set<Player> playerSet = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName()));Set<Player> playerSet = new TreeSet<>(Comparator.comparing(Player::getName));playerSet.addAll(playerList);/*new ArrayList<>(playerSet).forEach(player->{System.out.println(player.toString());});*///将去重之后的结果打印出来new ArrayList<>(playerSet).forEach(System.out::println);
}

输出结果如下:三个zimug因为name重复,另外两个被去重。但是因为使用到了TreeSet,list中元素被重新排序。

Player{name=‘curry’, age=‘30’}
Player{name=‘james’, age=‘32’}
Player{name=‘kobe’, age=‘10000’}
Player{name=‘zimug’, age=‘27’}

方法二(stream)
  • 首先用stream()把list集合转换成流
  • 然后用collect及toCollection把流转换成集合
  • 然后剩下的就和方法一相同了
@Test
void testRemove6() {List<Player> newList = playerList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Player::getName))),ArrayList::new));newList.forEach(System.out::println);
}
方法三(不会打乱顺序)

这种方法也是笔者建议大家使用的一种方法,咋一看好像代码量更大了,但实际上这种方法是应用比较简单的方法。

Predicate(有人管这个叫断言,从英文的角度作为名词可以翻译为谓词,作为动词可以翻译为断言)。谓词就是用来修饰主语的,比如:喜欢唱歌的小鸟,喜欢唱歌就是谓词,用来限定主语的范围。所以我们这里是用来filter过滤的,也是用来限制主语范围的,所以我认为翻译为谓词更合适。随便吧,看你怎么觉得怎么理解合理、好记,你就怎么来。

  • 首先我们定义一个谓词Predicate用来过滤,过滤的条件是distinctByKey。谓词返回ture元素保留,返回false元素被过滤掉。
  • 当然我们的需求是过滤掉重复元素。我们去重逻辑是通过map的putIfAbsent实现的。putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
  • 如果putIfAbsent返回null表示添加数据成功(不重复),如果putIfAbsent返回value(value==null :false),则满足了distinctByKey谓词的条件元素被过滤掉。

这种方法虽然看上去代码量增大了,但是distinctByKey谓词方法只需要被定义一次,就可以无限复用。

@Test
void testRemove7() {List<Player> newList = new ArrayList<>();playerList.stream().filter(distinctByKey(p -> p.getName())) //filter保留true的值.forEach(newList::add);newList.forEach(System.out::println);
}static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object,Boolean> seen = new ConcurrentHashMap<>();//putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。//如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE)return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

输出结果如下:三个zimug因为name重复,另外两个被去重。并且没有打乱List的原始顺序

Player{name=‘kobe’, age=‘10000’}
Player{name=‘james’, age=‘32’}
Player{name=‘curry’, age=‘30’}
Player{name=‘zimug’, age=‘27’}

方法四

第四种方法实际上不是新方法,上面的例子都是按某一个对象属性进行去重,如果我们想按照某几个元素进行去重,就需要对上面的三种方法进行改造。
我只改造其中一个,另外几个改造的原理是一样的,就是把多个比较属性加起来,作为一个String属性进行比较。

@Test
void testRemove8() {Set<Player> playerSet = new TreeSet<>(Comparator.comparing(o -> (o.getName() + "" + o.getAge())));playerSet.addAll(playerList);new ArrayList<>(playerSet).forEach(System.out::println);
}
http://www.dtcms.com/a/604449.html

相关文章:

  • 国内精美网站欣赏淘宝网站建设目标是什么
  • 做视频网站 带宽多少才合适公司建设哪个方便
  • 168网站建设店铺装修网站
  • python 网站开发实战wordpress程序下载
  • 微信授权登录第三方网站开发万户信息 做网站怎么样
  • 招聘网站建设技术要求镇江网站制作网站建设
  • 网站页眉设计wordpress 手机版本
  • 济南能源建设网站电子商务运营平台设计
  • 眉山市规划建设局网站加快wordpress图片的插件
  • 非小号是根据国外哪个网站做的厦门企业公司电话黄页
  • 自己如何做企业网站新闻发布网站建设实训小结
  • 网站后期推广是谁来做wordpress 关闭多站点
  • 网站后台查找软件带视频的网站模板
  • 珠海企业网站设计百度提交
  • 武侯区建设局门户网站贝壳找房官网首页入口
  • 白云区网站开发湛江专业建站免费咨询
  • 数据库对于做网站的重要性成品网站能用吗
  • 如何建设网站简答题一般通过什么渠道了解防灾减灾知识?(可多选)
  • 网站建设综合技术百度推广管理平台登录
  • 网站开发公司成本是什么项目管理软件培训
  • 网站 页面风格 建设金华做网站最专业的公司
  • 如何选择响应式网站算命先生的网站怎么做
  • 网站建设论文模板公司简介概况怎么写
  • 公司管理的三大系统百度关键词优化软件排名
  • 编写软件wordpress优化教程
  • 购买了网站如何使用吗网站备案黑名单
  • 北京建设协会网站淄博网站客户
  • 网站建设教程菜鸟物流打造龙头建设示范
  • 怎么做网站软文投放平台有哪些
  • 请列举常见的网站推广方法推广计划表