Set接口之TreeSet
*TreeSet*
这里需要特别说明一下TreeSet集合是无序的,即向集合中添加元素的顺序和取出元素的顺序是不一致的,但是底层基于红黑树实现,会根据元素本身进行排序,比方说你放进去的是2 1 3,取出来的是1 2 3,也就是说默认是升序排列。
简单小案例
package com.genericlist;
import java.util.Iterator;
import java.util.TreeSet;
/**
* TreeSet的简单使用
*
*/
public class TreeSetDemo01 {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet();
//1.添加数据
treeSet.add("apple");
treeSet.add("bananer");
treeSet.add("Durian");//表示榴莲
treeSet.add("apple");//不能添加重复的元素
System.out.println("集合大小===="+treeSet.size());
System.out.println("集合遍历===="+treeSet);//默认重写的toString方法
//2.删除
// treeSet.remove("apple");
// System.out.println("删除之后集合大小===="+treeSet.size());
// System.out.println("删除之后集合遍历===="+treeSet);//默认重写的toString方法
System.out.println("=========3.1使用增强for==========");
for (Object o : treeSet) {
String col1=(String) o;
System.out.println(col1);
}
//迭代器是专门用来遍历集合的一种方式
System.out.println("=========3.2使用iterator迭代器==========");
Iterator<String> iterator = treeSet.iterator();
while (iterator.hasNext()){
String col2 = (String)iterator.next();
System.out.println(col2);
}
//4.判断
System.out.println(treeSet.contains("bananer"));
}
}
运行结果:
集合大小====3
集合遍历====[Durian, apple, bananer]
=========3.1使用增强for==========
Durian
apple
bananer
=========3.2使用iterator迭代器==========
Durian
apple
bananer
True
*小练习-对随机字符串进行排序展示*
package com.genericlist;
import sun.applet.Main;
import java.util.Comparator;
import java.util.TreeSet;
/**
* 小案例:对给定的随机字符串进行排序,长度优先,然后在根据每个字符在字典表中的顺序进行排序
*/
public class TreeSetMiniCase {
public static void main(String[] args) {
TreeSet<String> treeSet=new TreeSet<String>(new Comparator<String>() {
public int compare(String o1, String o2) {
int n1 = o1.length() - o2.length();
int n2 = o1.compareTo(o2);
return n1==0?n2:n1;
}
});
//添加数据
treeSet.add("tqMGrtBlIL");
treeSet.add("fqTyNegIeU");
treeSet.add("aiuyaoLPli");
treeSet.add("YJZzlycwDb");
treeSet.add("xVwIUEBKPF");
treeSet.add("WtNbpfHppL");
treeSet.add("ZLKTjRrPYT");
System.out.println("元素的个数:"+treeSet.size());
System.out.println("元素内容:"+treeSet);
}
}
运行结果
元素的个数:7
元素内容:[WtNbpfHppL, YJZzlycwDb, ZLKTjRrPYT, aiuyaoLPli, fqTyNegIeU, tqMGrtBlIL, xVwIUEBKPF]
*小练习-Comparator实现可定制化比较*
package com.genericlist;
import sun.reflect.generics.tree.Tree;
import java.util.Comparator;
import java.util.TreeSet;
/**
* TreeSet集合的使用
* Comparator:实现定制比较(比较器)
* Comparable:可比较
*
*/
public class TreeSetComparator {
public static void main(String[] args) {
//创建集合
TreeSet<Person> personTreeSet=new TreeSet<Person>(new Comparator<Person>(){
public int compare(Person o1, Person o2) {
//先比较年龄,再比较姓名
int n1 = o1.getAge() - o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1==0?n2:n1;
}
});
Person person01 = new Person("张三", 20);
Person person02 = new Person("李四",21);
Person person03 = new Person("王五",22);
personTreeSet.add(person01);
personTreeSet.add(person02);
personTreeSet.add(person03);
personTreeSet.add(person03);//重复的元素是不能添加的
System.out.println("集合大小===="+personTreeSet.size());
System.out.println("集合遍历===="+personTreeSet);//默认重写的toString方法
}
}
运行结果:
集合大小====3
集合遍历====[Person{name='张三', age=20}, Person{name='李四', age=21}, Person{name='王五', age=22}]
*TreeSet排序-实体类要实现Comparable接口**
package com.genericlist;
import com.sun.org.apache.xpath.internal.operations.Equals;
/**
* 人类
*/
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
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
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/**
* 解释:为什么使用31
* 1.31是一个指数,减少散列冲突 2.31能够提高执行效率 31 * i = (i << 5) - i(左边 31*2=62,右边 2*2^5-2=62) - 两边相等
*
* @return
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//重写hashcode方法进行内存地址的判断
// @Override
// public int hashCode() {
// int n1 = this.name.hashCode();
// int n2 = this.age;
// return n1 + n2;
// }
//必须重写equals方法才能判断添加的对象是否重复
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Person) {
Person person = (Person) obj;
if (this.name.equals(person.getName()) && this.age == person.getAge()) {
return true;
}
}
return false;
}
/**
* 先按照姓名比较,再按照年龄进行比较,如果姓名相同,则返回年龄
*
* @param o
* @return
*/
public int compareTo(Person o) {
int n1 = this.getName().compareTo(o.getName());
int n2 = this.age - o.getAge();
return n1 == 0 ? n2 : n1;
}
}
创建测试类
package com.genericlist;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 使用TreeSet保存数据
* 存储结构:红黑树 左边的节点都要比右边的节点要小
* compareTo方法的返回值为0,则认为是重复元素则不能添加进来了
*/
public class TreeSetSort {
public static void main(String[] args) {
TreeSet<Person> personTreeSet = new TreeSet<Person>();
Person person01 = new Person("张三", 20);
Person person02 = new Person("李四",21);
Person person03 = new Person("王五",22);
personTreeSet.add(person01);
personTreeSet.add(person02);
personTreeSet.add(person03);
System.out.println("集合大小===="+personTreeSet.size());
System.out.println("集合遍历===="+personTreeSet);
//以上的遍历方式报错了 java.lang.ClassCastException: com.genericlist.Person cannot be cast to java.lang.Comparable
//实现了comparable接口之后,再次运行,发现就不报错了。
//2.删除
// personTreeSet.remove(person01);
// System.out.println("删除之后集合大小===="+personTreeSet.size());
// System.out.println("删除之后集合遍历===="+personTreeSet);
System.out.println("=========3.1使用增强for==========");
for (Object o : personTreeSet) {
Person col1=(Person) o;
System.out.println(col1);
}
//迭代器是专门用来遍历集合的一种方式
System.out.println("=========3.2使用iterator迭代器==========");
Iterator<Person> iterator = personTreeSet.iterator();
while (iterator.hasNext()){
Person col2 = (Person)iterator.next();
System.out.println(col2);
}
//4.判断
System.out.println(personTreeSet.contains(new Person("张三", 20)));
}
}
*运行结果*
集合大小====3
集合遍历====[Person{name='张三', age=20}, Person{name='李四', age=21}, Person{name='王五', age=22}]
=========3.1使用增强for==========
Person{name='张三', age=20}
Person{name='李四', age=21}
Person{name='王五', age=22}
=========3.2使用iterator迭代器==========
Person{name='张三', age=20}
Person{name='李四', age=21}
Person{name='王五', age=22}
true