TreeSet和HashSet不同,底层是二叉树,可以保证输出有序
二叉树,小的存储在左边(负数),大的在右边(正数),相等就不存
- 返回0,集合中只有一个元素(保证输出唯一,比如属性值相同的对象,就返回0)
- 返回-1,集合倒叙
- 返回1,怎么存怎么取(和根元素比较)
两种方法保证输出有序:
- 自然排序:用于自己创建的类的时候,让类implements Comparable,然后重写compareTo()方法。
- 比较器排序:直接再调用TreeSet的有参构造,创建接口Comparator的匿名子类对象(在直接作用输入的String/Integer对象的时候,不涉及到自己创建的类的时候可用,同时存在,比自然排序优先)
直接上几个练习:
collectionTest1();
在一个集合中存储无序且重复的字符串,定义一个方法,让其有序(字典顺序),而且不能去除重复
collectionTest2();
从键盘接受一个字符串,进行排序,如键盘输入:helloitcast 打印:acehillostt 分析:还是字典顺序,并且没有去除重复
collectionTest3();
键盘输入多个整数,输入quit时结束,把输入倒叙打印
collectionTest4();
键盘输入五个学生的信息,姓名,语数外,按照总分从高到低输出到控制台
package cn.xinhua;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;
/*
* 问题:在一个集合中存储无序且重复的字符串,定义一个方法,让其有序(字典顺序),而且不能去除重复
* 注:我一开始想用修改compareTo的方法的,但是发现这个不是我们自己创建的类啊,不能直接继承Comparable接口,所以就直接在TreeSet的构造函数里加上实现了Comparator接口的匿名类
*
*/
public class CollectionTest {
public static void main(String[] args) {
collectionTest1();
collectionTest2();
collectionTest3();
collectionTest4();
}
public static void collectionTest4() {
TreeSet<Student> tree = new TreeSet<>();
tree.add(new Student("周杰伦", 22, 33, 44));
tree.add(new Student("周杰伦", 22, 33, 44));
tree.add(new Student("吴彦祖", 11, 22, 33));
tree.add(new Student("陈奕迅", 55, 66, 77));
tree.add(new Student("林宥嘉", 33, 44, 55));
for (Student student : tree) {
System.out.println(student);
}
}
public static void collectionTest3() {
Scanner sc = new Scanner(System.in);
TreeSet<Integer> tree = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
// return -1;
int num = o1.compareTo(o2);
return num == 0 ? 1 : num;
}
});
System.out.println("请输入整数,结束输入:quit");
while (true) { // 都以字符串形式输入
// if(sc.nextLine() == "quit") {
String s = sc.nextLine();
if ("quit".equals(s)) {
break;
} else {
tree.add(Integer.parseInt(s));
}
}
for (Integer integer : tree) {
System.out.println(integer);
}
}
public static void collectionTest2() {
TreeSet<Character> tree = new TreeSet<Character>(new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
int num = o1.compareTo(o2);
return num == 0 ? 1 : num;
}
});
Scanner sc = new Scanner(System.in);
System.out.println("老铁,请输入一个字符串:");
String str = sc.nextLine();
char[] cha = str.toCharArray();
for (char c : cha) {
tree.add(c);
}
for (char c : tree) {
System.out.print(c);
}
}
public static void collectionTest1() {
List<String> list = new ArrayList<String>();
list.add("vvvv");
list.add("zzzzzz");
list.add("vvvv");
list.add("gdagg");
list.add("rrrrr");
list.add("gdagg");
list.add("ppppp");
TreeSet<String> tree = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2) != 0 ? o1.compareTo(o2) : o1.compareTo(o2) + 1; // +1防止变为0,我真他两的是个天才
} // 不需要在下面创建子类了,直接new Comparator<String>()创建接口的子类对象
});
for (String string : list) {
tree.add(string);
}
for (String string : tree) {
System.out.println(string);
}
}
}
练习4中的Student类:
package cn.xinhua;
public class Student implements Comparable<Student>{
private String name;
private int Ygrade;
private int Sgrade;
private int Wgrade;
public Student() {
super();
}
public Student(String name, int ygrade, int sgrade, int wgrade) {
super();
this.name = name;
Ygrade = ygrade;
Sgrade = sgrade;
Wgrade = wgrade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYgrade() {
return Ygrade;
}
public void setYgrade(int ygrade) {
Ygrade = ygrade;
}
public int getSgrade() {
return Sgrade;
}
public void setSgrade(int sgrade) {
Sgrade = sgrade;
}
public int getWgrade() {
return Wgrade;
}
public void setWgrade(int wgrade) {
Wgrade = wgrade;
}
@Override
public int compareTo(Student o) {
int sum1 = o.Sgrade + o.Wgrade + o.Ygrade; //输入的对象
int sum2 = this.Sgrade + this.Wgrade + this.Ygrade; //当前的对象
return (sum1 - sum2 == 0) ? 0 : (sum1 > sum2 ? 1 : -1);}
@Override
public String toString() {
return "Student [name=" + name + ", Ygrade=" + Ygrade + ", Sgrade=" + Sgrade + ", Wgrade=" + Wgrade + "]";
}
}