layout: post
#标题配置
title: Java中的Set集合
#时间配置
date: 2021-07-19 22:49:00 +0800
#目录配置
categories: 数据结构
#标签配置
tag: 学习笔记
- content
{:toc}
Set集合概述和特点
一.Set集合特点
-
可以去除重复(*)
-
存取顺序不一致
-
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
(可以使用迭代器以及增强for循环)
二.TreeSet集合概述和特点
1.TreeSet集合特点(使用TreeSet必须指定规则)
(1)不包含重复重复元素的集合
(2)没有带索引的方法
(3)可以将元素按照规则进行排序
2.自然排序Comparable的使用
(1)使用空参构造创建TreeSet集合
(2)自定义的Student类实现Comparable接口
(3)重写里面的compareTo方法
自然排序简单原理
(1)如果返回值为负数,表示当前存入的元素是较小值,存左边
(2)如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
(3)如果返回值为正数,表示当前存入的元素是较大值,存右边
字符串的compareTo方法
1.首先比较第一个字母,如果第一个字母是一样的,那么继续比较后面的字母
2.当不一样的时候,就拿着对应的码表值97,减去b的码表值98
比较器排序Comparator的使用
(1)TreeSet的带参构造方法使用的是比较器排序对元素进行排序的
(2)比较器排序,就是让集合构造方法接收Comparator的实现类对象,
重写compare(T o1,T o2)方法
(3)重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
两种比较方式小结
**自然排序:**自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
package 日常练习.数据结构练习.Set;
import java.util.Comparator;
import java.util.TreeSet;
public class MyTreeSet5 {
public static void main(String[] args) {
TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int result = o1.length() - o2.length();
result = result == 0 ? o1.compareTo(o2) : result;
return result;
}
});
ts.add("c");
ts.add("ab");
ts.add("df");
ts.add("qwer");
System.out.println(ts);
}
}
还可以使用lambda表达式
package 日常练习.数据结构练习.Set;
import java.util.Comparator;
import java.util.TreeSet;
public class MyTreeSet5 {
public static void main(String[] args) {
TreeSet<String> ts = new TreeSet<> (
(String o1, String o2) -> {
int result = o1.length() - o2.length();
result = result == 0 ? o1.compareTo(o2) : result;
return result;
}
);
ts.add("c");
ts.add("ab");
ts.add("df");
ts.add("qwer");
System.out.println(ts);
}
}
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
两种方式中,关于返回值的规则:
(1)如果返回值为负数,表示当前存入的元素是较小值,存左边
(2)如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
(3)如果返回值为正数,表示当前存入的元素是较大值,存右边