好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java实现List去重的方法详解

简介

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

List去重的方法

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

JDK8的stream的distinct

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

直接去重

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

package com.example.a;

 

import java.util.*;

import java.util.stream.Collectors;

 

public class Demo {

     public static void main(String[] args) {

         List<Integer> list = new ArrayList<>();

         list.add( 1 );

         list.add( 3 );

         list.add( 2 );

         list.add( 3 );

 

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

         System.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<Integer> stream(List<Integer> list) {

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

     }

 

     //HashSet(不保持顺序)

     private static List<Integer> hashSetWithoutOrder(List<Integer> list) {

         HashSet<Integer> h = new HashSet<Integer>(list);

         return new ArrayList<>(h);

     }

 

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

     public static List<Integer> hashSetWithOrder(List<Integer> list) {

         Set<Integer> set = new HashSet<Integer>();

         List<Integer> newList = new ArrayList<Integer>();

         for (Integer element : list) {

             if (set.add(element))

                 newList.add(element);

         }

         return newList;

     }

 

     //TreeSet(自动排序)

     public static List<Integer> treeSet(List<Integer> list) {

         TreeSet<Integer> set = new TreeSet<Integer>(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 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

         o1.getName()测试数据pareTo(o2.getName()));

setByName.addAll(list);

List<User> listByName = new ArrayList<>(setByName);

System.out.println(listByName);

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

 

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

     return (o1.getName() + o1.getAge())测试数据pareTo((o2.getName() + o2.getAge()));

//            return o1.getName()测试数据pareTo(o2.getName()) == 0

//                    ? o1.getAge()测试数据pareTo(o2.getAge())

//                    : o1.getName()测试数据pareTo(o2.getName());

});

setByNameAndAge.addAll(list);

List<User> 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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

List<User> streamByNameList = list.stream().collect(Collectors.collectingAndThen(

         Collectors.toCollection(() -> new TreeSet<>(Comparator测试数据paring(User::getName))), ArrayList:: new

));

System.out.println(streamByNameList);

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

 

List<User> streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(

         Collectors.toCollection(

             () -> new TreeSet<>(Comparator测试数据paring(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'}]

所有代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

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<User> list = new ArrayList<User>() {{

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

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

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

         }};

 

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

                 o1.getName()测试数据pareTo(o2.getName()));

         setByName.addAll(list);

         List<User> listByName = new ArrayList<>(setByName);

         System.out.println(listByName);

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

 

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

             return (o1.getName() + o1.getAge())测试数据pareTo((o2.getName() + o2.getAge()));

//            return o1.getName()测试数据pareTo(o2.getName()) == 0

//                    ? o1.getAge()测试数据pareTo(o2.getAge())

//                    : o1.getName()测试数据pareTo(o2.getName());

         });

         setByNameAndAge.addAll(list);

         List<User> 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<User> streamByNameList = list.stream().collect(Collectors.collectingAndThen(

                 Collectors.toCollection(

                     () -> new TreeSet<>(Comparator测试数据paring(User::getName))), ArrayList:: new

         ));

         System.out.println(streamByNameList);

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

 

         List<User> streamByNameAndAgeList = list.stream().collect(Collectors.collectingAndThen(

                 Collectors.toCollection(

                   () -> new TreeSet<>(Comparator测试数据paring(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'}]

     }

}

到此这篇关于Java实现List去重的方法详解的文章就介绍到这了,更多相关Java List去重内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/feiying0canglang/article/details/124853472

查看更多关于Java实现List去重的方法详解的详细内容...

  阅读:16次