Java基础笔记24-Set集合
-
Set 集合
-
Set集合是不允许重复,且无序的一种集合。
-
常用实现子类
-
HashSet
- HashSet 底层是通过HashMap实现的,HashMap的底层是哈希表结构。
-
TreeSet
- TreeSet 底层是TreeMap来实现的,TreeMap的底层是红黑树数据结构。
- TreeSet默认是自然排序,不能对自定义类型进行排序的
- 如果想要对自定义类型进行排序,有两种方案:
- 1、内部实现Comparable接口,重写compareTo方法
- 假设:假设年龄和名字一样就代表同一个对象
- 2、外部自定义一个比较器给集合,覆盖其本身的比较器
-
-
代码示例,在TreeSet集合中添加自定义类型数据
-
自定义数据类型User,通过compareTo方法重写,来进行添加元素时自动排序,如果不进行重写,则无法正常添加元素。
-
//自定义类User public class User implements Comparable{ private String name; private int age; public User() { super(); } public User(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override //重写compareTo()方法 public int compareTo(Object o) { User user = (User)o; int temp = this.age - user.age; if(temp == 0) { return this.name.compareTo(user.name); } return temp; } @Override public String toString() { return "User ["+name + ":" + age +"]"; } }
- 添加自定义类型的TreeSet集合:
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
treeSetMethod();
}
public static void treeSetMethod() {
//创建User对象
User user1 = new User("高文",756);
User user2 = new User("瑞贝卡",18);
User user3 = new User("琥珀",120);
//创建treeSet集合,并指定泛型为User
Set<User> treeSet = new TreeSet<>();
//将User对象添加到TreeSet集合中
treeSet.add(user1);
treeSet.add(user2);
treeSet.add(user3);
System.out.println("treeSet集合:"+treeSet);
//使用迭代器将集合输出
Iterator<User> it = treeSet.iterator();
//循环迭代输出
System.out.println("treeSet集合遍历输出:");
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
输出:
treeSet集合:[User [瑞贝卡:18], User [琥珀:120], User [高文:756]]
treeSet集合遍历输出:
User [瑞贝卡:18]
User [琥珀:120]
User [高文:756]
使用自定义比较器进行排序方法
- 自定义比较器
public class CompareByLength implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
User user1 = (User)o1;
User user2 = (User)o2;
//先比较名字长度
int temp = user1.getName().length() - user2.getName().length();
//名字长度相同时,比较年龄
if (temp == 0) {
return user1.getAge() - user2.getAge();
}
return temp;
}
}
调用自定义比较器对自定义数据类型进行排序
package cn.yunhe.set;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
treeSetMethod2();
}
public static void treeSetMethod2() {
//创建User对象
User user1 = new User("高文",756);
User user2 = new User("瑞贝卡",18);
User user3 = new User("琥珀",120);
User user4 = new User("维罗妮卡",1200);
User user5 = new User("拜伦",45);
User user6 = new User("bob",120);
//创建treeSet集合,并指定泛型为User,使用自定义比较器,先比较名字长度排序,名字相同再比较年龄,升序
Set<User> treeSet =new TreeSet<>(new CompareByLength());
//将User对象添加到TreeSet集合中
treeSet.add(user1);
treeSet.add(user2);
treeSet.add(user3);
treeSet.add(user4);
treeSet.add(user5);
treeSet.add(user6);
System.out.println("treeSet集合:"+treeSet);
//使用迭代器将集合输出
Iterator<User> it = treeSet.iterator();
//循环迭代输出
System.out.println("treeSet集合遍历输出:");
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
输出:
treeSet集合:[User [拜伦:45], User [琥珀:120], User [高文:756], User [瑞贝卡:18], User [bob:120], User [维罗妮卡:1200]]
treeSet集合遍历输出:
User [拜伦:45]
User [琥珀:120]
User [高文:756]
User [瑞贝卡:18]
User [bob:120]
User [维罗妮卡:1200]