TreeSet有自然排序也有选择器排序,这里先写自然排序。`
自然排序没啥说的,就是直接调用内部的Compare构造器排,算法运用的是红黑树的排序方法。
package cn.setdemo;
import java.util.HashSet;
import java.util.Set;
// Collection
// I --List
// 有序(存储顺序和职出顺序致),可重复
// | --Set
// 无序(存储顺序和取出顺序不-致) ,唯- -
// Hashset:它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。
// 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,
// 而你的顺序恰好和它的存储顺序一致, 这代表不了有序,你可以多存储一些数据,就能看到效果。
public class SetDemo {
public static void main(String[] args) {
Set<String> set =new HashSet<String>();
set.add("hello");
set.add("world");
set.add("java");
set.add("world");
set.add("java");
for (String x : set)
{
System.out.println(x);
}
}
}
当自然排序遇到了形参的话,需要自己去重写ComareTo的方法:
package cn.setdemo_01;
import java.util.Objects;
public class Student implements Comparable<Student>{
private int age;
private String name;
public Student(String name, int age) {
this.age = age;
this.name = name;
}
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 int compareTo(Student o) {
//int num =o.age-this.age;
// int num2 = num==0?this.name.compareTo(o.name):num;
//先比年龄后比字符串,第一个字符不同就返回第一个字符,都一样返回长度之差
int num = this.name.length()-o.name.length();
int num2 = num==0?this.name.compareTo(o.name):num;
int num3 = num2==0?o.age-this.age:num2;
//如果年龄相同就比姓名,否则还是返回年龄。
//判断num等不等于零,等于零的话
//int num2=this.name.compareTo(s.name)
//注:compareTo返回的是字符串长度之差
return num3;
}
}
主方法
package cn.setdemo_01;
import sun.reflect.generics.tree.Tree;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo {
public static void main(String[] args) {
TreeSet<Student> hs=new TreeSet<Student>(); // 用的是自然排序
hs.add(new Student("zsp",20));
hs.add(new Student("wlx",22));
hs.add(new Student("lfl",21));
hs.add(new Student("wlx",20));
hs.add(new Student("lfl",21));
hs.add(new Student("jxf",22));
hs.add(new Student("qax",22));
for (Student s:hs)
{
System.out.println(s.getName()+"----"+s.getAge());
}
}
}