新手自己记录,方便以后自己查看
附上其他大佬的文章
链接: https://blog.csdn.net/Jsagacity/article/details/76039333
https://www.cnblogs.com/mercuryli/p/4620435.html
首先先简介一下set集合
set集合继承于collection接口下面的子类有HashSet,SortedSet,EnumSet
HashSet:
实现了set接口,由HashMap支持,他不保证迭代顺序,无序的且不可重复(存储和取出的顺序都不同),没有索引,不存储重复元素。
LinkedHashSet:
是HashSet的子类,不允许元素重复,并且保证元素的插入顺序,底层是哈希表和链表算法。由于多使用了一个链表来记录元素的插入顺序所以性能较HashSet低,如果要求一个集合急要保证元素不重复,也需要记录元素的先后添加顺序,才选择使用LinkedHashSet
TreeSet:
是SortedSet的子类,能够对集合中的对象进行排序
自然排序和定制排序:
自然排序:
要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法在此方法中,指明按照自定义类的哪个属性进行排序。向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。因此要求compareTo()与hashCode()以及equals()三者保持一致!
贴代码啦!
package model;
//实现Comparable<> 接口
public class User implements Comparable<User>{
private Integer id;
private String name;
private Integer age;
private String sex;
public User(Integer id, String name, Integer age, String sex) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public User() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean equals(Object obj) {
return super.equals(obj);
}
/**
* 实现实现Comparable<> 接口的compareTo方法
* instanceof方法判断 某参数是否是某一个对象的实例
* Comparator<>() 比较器:返回对此set元素进行排序的比较器,如果此Set使用其元素的自然排序顺序,则返回NULL
*/
@Override
public int compareTo(User o) {
if(o instanceof User) { //判断o是否是User对象的一个实例
User user = o;
//按字典顺序比较两个字符串,
//compareTo就是比较两个值,如果前者大于后者,返回1,等于返回0,小于返回-1
//return -1; //-1表示放在红黑树的左边,即逆序输出
//return 1; //1表示放在红黑树的右边,即顺序输出
//return 0; //表示元素相同,仅存放第一个元素
//如果这两个字符串相等,则结果为 0
int result = user.getAge().compareTo(this.age);
//有一个写法 :int num1=result==0?this.sex.compareTo(user.getSex()):result;
//如果结果为0则判断性别,根据性别排序。否则result排序
if(result == 0) {
return this.sex.compareTo(user.getSex());
}else {
return result;
}
}
return 0;
}
}
下面是方法!
package one;
import java.util.Set;
import java.util.TreeSet;
import model.User;
public class test01 {
public static void main(String[] args) {
Set<User> set = new TreeSet<>();
set.add(new User(1, "张飞", 10, "女"));
set.add(new User(2, "李白", 10, "男"));
set.add(new User(3, "刘备", 30, "女"));
set.add(new User(4, "关羽", 20, "男"));
set.add(new User(5, "奥尔良", 20, "女"));
set.add(new User(5, "奥尔良", 20, "女"));
System.out.println(set.size());
for (User user : set) {
System.out.println(user.getId()+"--"+user.getName()+"--"+user.getSex()+
"--"+user.getAge());
}
}
}
定制排序:
定制排序和自然排序写法差不多。
自然排序是在javaBean中实现Comparable<>接口定制排序规则。
定制排序则是直接在当前类中实现Comparator<>接口定制排序规则。
public class test01 implements Comparator<User> {//实现Comparator接口
@Override
public int compare(User arg0, User arg1) {//定制排序规则
if(arg0 instanceof User && arg1 instanceof User) {//判断前一个字段是否为User类的一个实例
Integer sum = arg1.getAge()-arg0.getAge(); //年龄排序
return sum==0?(arg0.getSex().compareTo(arg1.getSex())):sum;//年龄相同则按照性别
}
return 0;
}
public static void main(String[] args) {
Set<User> set = new TreeSet<>(new test01());
set.add(new User(1, "张飞", 10, "女"));
set.add(new User(2, "李白", 10, "男"));
set.add(new User(3, "刘备", 30, "女"));
set.add(new User(4, "关羽", 20, "男"));
set.add(new User(5, "奥尔良", 20, "女"));
set.add(new User(5, "奥尔良", 20, "女"));
System.out.println(set.size());
for (User user : set) {
System.out.println(user.getId()+"--"+user.getName()+"--"+user.getSex()+
"--"+user.getAge());
}
}