心灵鸡汤:

加载中...

list去重方法

List去重总结

List和Set区别

!>Java中的集合分三大类,分别是Set(集),List(列表)以及Map(映射)

1、List和Set都是接口继承于Collection接口。

2、List有序可重复的。而Set无序不可重复的

3、List接口的三个实现类:LinkedList,ArrayList,Vector ,Set接口的两个实现类:HashSet,LinkedHashSet

4、List适合经常追加数据,插入,删除数据。但随机取数效率比较低。

5、Set适合经常地随机储存,插入,删除。但是在遍历时效率比较低。

去重方法

1、运用Set无序不重复特性

ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,2,3,3,3,4,4));
HashSet<Integer> set = new HashSet<Integer>(list1.size());  
List<Integer> newlist= new ArrayList<Integer>(list1.size());  
for (Integer it : list1) {
    if (set.add(it)) {   //运用Set无序不可重复特点来判断
        newlist.add(it);  //把不重复的数据添加到新的newlist
    }
}
list1.clear();   //循环后把原list1清空
list1.addAll(newlist);  //再把新的newlist全部加到list1中去,得到去重后的list1
System.out.println(list1);  //[1, 2, 3, 4]

2、list转set自动去重

//list2转set的时候去重,set再转newlist2
LinkedList<Integer> list2= new LinkedList<>(Arrays.asList(1,2,2,3,3,3,4,4));

LinkedHashSet<Integer> lhset= new LinkedHashSet<>(list2);

LinkedList<Integer> newlist2= new LinkedList<>(lhset);

System.out.println(newlist2);//[1, 2, 3, 4]

3、遍历list3,用contains判断有重复的就不存放到newlist3中去。循环结束后把list3清空,再把newlist3全部放进去,得到去重后的list3

// 
LinkedList<Integer> list3= new LinkedList<>(Arrays.asList(1,2,2,3,3,3,4,4));
LinkedList<Integer> newlist3=new LinkedList<>();
for (int i = 0; i < list3.size(); i++) {
    if(!newlist3.contains(list3.get(i))){
        newlist3.add(list3.get(i));
    }
}
list3.clear();
list3.addAll(newlist3);
System.out.println(list3); //[1, 2, 3, 4]

4、用Stream流的distinct方法去重

 LinkedList<Integer> list4= new LinkedList<>(Arrays.asList(1,2,2,3,3,3,4,4));
 Stream<Integer> liststream= list4.stream().distinct();

// distinct.forEach(res-> System.out.println(res));  //输出每一项    
//重复后的liststream转成newlist4
List<Integer> newlist4= liststream.collect(Collectors.toList());  
 System.out.println(newlist4);//[1, 2, 3, 4]

5、如果List中存放的是Entity类对象,要根据某个字段去重,可考虑TreeSet去重

//实体类
public class Student {
    private String name;
    private int age;
    private double score;
    ......       //省略get、set、构造等一系列方法
    }
    
List<Student> students = Arrays.asList(
        new Student("小明", 20, 91),
        new Student("小明", 20, 90), 
        new Student("小黑", 19, 60), 
        new Student("小白", 22, 89)
        );
//定义一个Student类的TreeSet,根据Name字段比较去重的比较器
TreeSet<Student> treeSet = new TreeSet<>(Comparator.comparing(Student::getName)); 
//Students实体类对象students添加到TreeSet中去进行比较
treeSet.addAll(students);
//TreeSet再转换成List
List<Student> resList= treeSet.stream().collect(Collectors.toList());
System.out.println(resList);

就着Stream,顺便记录一下排序

java8新特性了解一下

//实体类
public class Student {
    private String name;
    private int age;
    private double score;
    ......       //省略get、set、构造等一系列方法
    }
    
List<Student> students = Arrays.asList(
        new Student("小明", 20, 91),
        new Student("小明", 20, 90), 
        new Student("小黑", 19, 60), 
        new Student("小白", 22, 89)
        );
 //students对象转流后进行sorted排序,根据Age字段排序,limit取前两条。
Stream<Student> sortedStream = students.stream().sorted((item2, item1) -> item1.getAge() > item2.getAge()).limit(2);
List<Student> newList= sortedStream.collect(Collectors.toList());
posted @ 2025-03-20 15:24  Mosey  阅读(46)  评论(0)    收藏  举报
TOP