Java实现List去重的方法详解(JAVA list去重)

网友投稿 1086 2022-07-28


目录简介直接去重根据对象属性去重法1:TreeSet 法2:stream+TreeSet所有代码

简介

本文用示例介绍java的List(ArrayList、LinkedList等)的去重的方法。

List去重的方法

一共有这几种方法(按推荐顺序排列):

JDK8的stream的distinct

转为HashSet(分不保持顺序和保持顺序两种)转为TreeSet使用retainAll/removeAll、contains、equals等基本方法

直接去重

package com.example.a;

import java.util.*;

import java.util.stream.Collectors;

public class Demo {

public static void main(String[] args) {

List list = new ArrayList<>();

list.add(1);

list.add(3);

list.add(2);

list.add(3);

System.out.println("源数据: " + list);

SyfiQVzQstem.out.println("stream: " + stream(list));

System.out.println("hashSetWithoutOrder:" + hashSetWithOrder(list));

System.out.println("hashSetWithOrder: " + hashSetWithOrder(list));

System.out.println("treeSet: " + treeSet(list));

}

//JDK1.8的stream去重

private static List stream(List list) {

return list.stream().distinct().collect(Collectors.toList());

}

//HashSet(不保持顺序)

private static List hashSetWithoutOrder(List list) {

HashSet h = new HashSet(list);

return new ArrayList<>(h);

}

// 删除ArrayList中重复元素,保持顺序

public static List hashSetWithOrder(List list) {

Set set = new HashSet();

List newList = new ArrayList();

for (Integer element : list) {

if (set.add(element))

newList.add(element);

}

return newList;

}

//TreeSet(自动排序)

public static List treeSet(List list) {

TreeSet set = new TreeSet(list);

return new ArrayList<>(set);

}

}

执行结果

源数据:             [1, 3, 2, 3]stream:             [1, 3, 2]hashSetWithoutOrder:[1, 3, 2]hashSetWithOrder:   [1, 3, 2]treeSet:            [1, 2, 3]

根据对象属性去重

法1:TreeSet

Set setByName = new TreeSet((o1, o2) ->

o1.getName().compareTo(o2.getName()));

setByName.addAll(list);

List listByName = new ArrayList<>(setByName);

System.out.println(listBfiQVzQyName);

//[User{name='Pepper', age=20, Phone='123'}, User{nhttp://ame='Tony', age=20, Phone='12'}]

Set setByNameAndAge = new TreeSet((o1, o2) -> {

return (o1.getName() + o1.getAge()).compareTo((o2.getName() + o2.getAge()));

// return o1.getName().compareTo(o2.getName()) == 0

// ? o1.getAge().compareTo(o2.getAge())

// : o1.getName().compareTo(o2.getName());

});

setByNameAndAge.addAll(list);

List listByNameAndAge = new ArrayList<>(setByNameAndAge);

System.out.println(listByNameAndAge);

//[User{name='Pepper', age=20, Phone='123'},

// User{name='Tony', age=20, Phone='12'},

// User{name='Tony', age=22, Phone='1234'}]

法2:stream+TreeSet

List streamByNameList = list.stream().collect(Collectors.collectingAndThen(

Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new

));

System.out.println(streamByNameList);

//[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

List streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(

Collectors.toCollection(

() -> new TreeSet<>(Comparator.comparing(o -> o.getName() + o.getAge()))), ArrayList::new

));

System.out.println(streamByNameAndAgeList);

//[User{name='Pepper', age=20, Phone='123'},

// User{name='Tony', age=20, Phone='12'},

// User{name='Tony', age=22, Phone='1234'}]

所有代码

package org.example.a;

import java.util.*;

import java.util.stream.Collectors;

class User {

private String name;

private Integer age;

private String Phone;

public User(String name, Integer age, String phone) {

this.name = name;

this.age = age;

Phone = phone;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public String getPhone() {

return Phone;

}

public void setPhone(String phone) {

Phone = phone;

}

@Override

public String toString() {

return "User{" +

"name='" + name + '\'' +

", age=" + age +

", Phone='" + Phone + '\'' +

'}';

}

}

public class Demo {

public static void main(String[] args) {

List list = new ArrayList() {{

add(new User("Tony", 20, "12"));

add(new User("Pepper", 20, "123"));

add(new User("Tony", 22, "1234"));

}};

Set setByName = new TreeSet((o1, o2) ->

o1.getName().compareTo(o2.getName()));

setByName.addAll(list);

List listByName = new ArrayList<>(setByName);

System.out.println(listByName);

//[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

Set setByNameAndAge = new TreeSet((o1, o2) -> {

return (o1.getName() + o1.getAge()).compareTo((o2.getName() + o2.getAge()));

// return o1.getName().compareTo(o2.getName()) == 0

// ? o1.getAge().compareTo(o2.getAge())

// : o1.getName().compareTo(o2.getName());

});

setByNameAndAge.addAll(list);

List listByNameAndAge = new ArrayList<>(setByNameAndAge);

System.out.println(listByNameAndAge);

//[User{name='Pepper', age=20, Phone='123'},

// User{name='Tony', age=20, Phone='12'},

// User{name='Tony', age=22, Phone='1234'}]

List streamByNameList = list.stream().collect(Collectors.collectingAndThen(

Collectors.toCollection(

() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new

));

System.out.println(streamByNameList);

//[User{name='Pepper', age=20, Phone='123'}, User{name='Tony', age=20, Phone='12'}]

List streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(

Collectors.toCollection(

() -> new TreeSet<>(Comparator.comparing(o -> o.getName() + o.getAge()))), ArrayList::new

));

System.out.println(streamByNameAndAgeList);

//[User{name='Pepper', age=20, Phone='123'},

// User{name='Tony', age=20, Phone='12'},

// User{name='Tony', age=22, Phone='1234'}]

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java中Lambda表达式的使用详细教程(java lambda函数)
下一篇:Java面试synchronized偏向锁后hashcode存址(java中的synchronized)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~