代码编织梦想

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

实际的工作中,按照集合元素对象整体去重的应用的比较少,更多的是要求我们按照元素对象的某些属性进行去重。

TreeSet实现Comparator接口

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

  • 方法引用: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);
}
  • lambda表达式:(o1, o2) -> o1.getName().compareTo(o2.getName())
    首先用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);
}

filter方法

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

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

利用多个属性去重

@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);
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43544283/article/details/127208895

java list<object>去掉重复对象-java8_微风--轻许--的博客-爱代码爱编程

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 public List<String> removeStringListDupli(List<String> stringList) { Set<String> set = new LinkedHashSet&l

list去重复 java_如何去除Java中List集合中的重复数据-爱代码爱编程

1.循环list中的所有元素然后删除重复 public class duplicatRemoval { public static List removeDuplicate(List list){ for(int i=0;i for(int j=list.size()-1;j>i;j--){ if(list. get(j). equal

java对象去重复_JAVA中List对象去除重复值的方法-爱代码爱编程

JAVA中List对象去除重复值,大致分为两种情况,一种是List、List这类,直接根据List中的值进行去重,另一种是List这种,List中存的是javabean对象,需要根据List中对象的某个值或某几个值进行比较去重。方法如下: 一、List、List对象去重复值。 这种情况的话,处理起来比较简单,通过JDK1.8新特性stream的di

Java对List中的对象去重-爱代码爱编程

Java对List中的对象去重 前言 下边我会针对List<String>基本类型,以及 List<User> 这种JavaBean对象去重(根据某个字段比较去重)。 验证 一、对List<String>基本类型去重 List<String> strList = n

List根据对象属性去重-爱代码爱编程

List根据对象属性去重 一、去除List中重复的String List<String> stringList = Arrays.asList("1", "2","3","1","1","1","1"); Set<String> set = new LinkedHashSet<>(); set.ad

Java集合去重-爱代码爱编程

在日常工作中,我们时常会遇到需要对数据进行遍历去重的操作,笔者便将自己所熟知的几种方法分享给大家。 首先模拟一个实体类,并创建一个main方法调用。 public static void main(String[] args) { List<User> list = new ArrayList(4); li

java list类型的对象集合去重_new_cccccc的博客-爱代码爱编程

背景:最近工作中遇到一个需要对对象类型的集合进行去重,百度了很久都没找到,搜到的都是对String类型,Integer类型的集合进行去重没有对象集合去重。         这个去重思想虽然简单,但也要小记录一下,以后有需要还可以参考这样的思想。         之前写的逻辑是自己与自己比较,因此需要双层for循环,在双层for循环里面使用list.re

list 根据对象的属性去重_妃宫千早的博客-爱代码爱编程

第一种 对象去重 注意 优先在类中对象的equals()方法和hashCode()方法: Person p1 = new Person(1l, "jack"); Person p2 = new Person(3l, "jack chou"); Person p3 = new Person(2l, "tom");

java按照list集合中的对象属性进行去重_野生java研究僧的博客-爱代码爱编程

文章目录 1.java按照list集合中的对象属性进行去重 1.java按照list集合中的对象属性进行去重 有时候我们需要对List集合进行去重,但是去重的集合不是String,Integer等简单的数据类型,而是复杂的对象类型,并且是根据List集合中的对象的指定属性进行去重,我这里封装了一个方法,是根据jdk源码来的,不需要引入任何第三

java8 list对象去重(按照对象属相去重)_阿king的架构之路的博客-爱代码爱编程

/** * 方式一:去重后对象在集合的顺序变化 * List对象去重,按照对象的某个字段去重,返回去重后新的对象集合 * **/ public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(

java集合去重(根据对象某个属性进行去重)_我的猪宝宝郑雨欣的博客-爱代码爱编程

集合元素为对象时,根据对象中属性去重操作,如下所示: List<User> list = Arrays.asList(new User(3,"张三"), new User(2,"李四"),new User(2,"王五")); 1.根据 用户年龄去重: List<User> newDto = list.stream().coll