TreeSet的排序
TreeSet的的排序使用
TreeSet的两种排序方式:
- 自然排序
- 比较器排序
自然排序
- 新建一个实体类,注意这个实体类要实现接口 Comparable 。见代码详解:
1 package zh.stu.sort.TreeSetTest; 2 3 public class Person implements Comparable<Person>{ 4 5 private String uname; 6 7 private int age; 8 9 public Person(){ 10 super(); 11 } 12 13 public Person(String uname, int age) { 14 super(); 15 this.uname = uname; 16 this.age = age; 17 } 18 19 public String getUname() { 20 return uname; 21 } 22 23 public void setUname(String uname) { 24 this.uname = uname; 25 } 26 27 public int getAge() { 28 return age; 29 } 30 31 public void setAge(int age) { 32 this.age = age; 33 } 34 35 public int compareTo(Person p) { 36 // return -1 -1 表示放在红黑树的左边,就是逆序输出 37 // return 1 1 表示放在红黑树的右边,就是顺序输出 38 // return 0 0 表示元素相同,仅存放第一个元素 39 40 // 主要条件 姓名的长度 ,如果姓名长度小的那么就放在左子树,否则放在右子树 41 int num=this.uname.length()- p.uname.length(); 42 43 // 此时姓名的长度相同,不代表姓名相同。 44 // 如果按照字典顺序比,string 对象位于参数字符串之前,那么比较结果是一个负整数 45 // 如果按照字典顺序比, string 对象位于参数字符串之后,那么比较结果为一个正整数 46 // 如果两个字符串相等,那么返回0 47 int num1= num ==0 ? this.uname.compareTo(p.uname) : num; 48 // 内容相同,年龄不一定相同。在按照年龄排序 49 int num2 = num1==0 ? this.age-p.age : num1; 50 return num2; 51 } 52 }
- 做排序测试
1 package zh.stu.sort.TreeSetTest; 2 3 import java.util.TreeSet; 4 5 public class SortTest { 6 7 public static void main(String[] args) { 8 // 自然排序 9 TreeSet<Person> treeSet = new TreeSet<Person>(); 10 // 在使用的是汉字排序的时候 11 Person p=new Person("詹姆斯",18); 12 Person p1=new Person("艾弗森",20); 13 Person p2=new Person("科比",20); 14 Person p3=new Person("乔丹",22); 15 Person p4=new Person("戴维斯",12); 16 treeSet.add(p); 17 treeSet.add(p1); 18 treeSet.add(p2); 19 treeSet.add(p3); 20 treeSet.add(p4); 21 for (Person person : treeSet) { 22 System.out.println(person.getUname() +"----"+ person.getAge()); 23 } 24 } 25 }
- 在控制台输出结果
乔丹----22 科比----20 戴维斯----12 艾弗森----20 詹姆斯----18
比较器排序
- 新建一个实体类
package zh.stu.sort.TreeSetTest.TheComparator; public class User { 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; } }
- 新加一个比较器,但是要实现接口Comparator
1 package zh.stu.sort.TreeSetTest.TheComparator; 2 3 import java.util.Comparator; 4 5 // 实现接口Comparator 6 public class MyComparator implements Comparator<User> { 7 8 public int compare(User o1, User o2) { 9 10 int num=o1.getName().length()-o2.getName().length(); 11 12 int num1= num == 0 ? o1.getName().compareTo(o2.getName()) : num; 13 14 int num2 = num1 == 0? o1.getAge() - o2.getAge() : num1; 15 16 return num2; 17 } 18 }
- 最后在类中做测试
1 package zh.stu.sort.TreeSetTest.TheComparator; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 public class Test { 7 8 public static void main(String[] args) { 9 TreeSet<User> users = new TreeSet<User>(new MyComparator()); 10 11 User user =new User("乔丹",22); 12 User user1 =new User("艾弗森",24); 13 User user2 =new User("乔丹",21); 14 User user3 =new User("Zion",62); 15 User user4 =new User("欧文",22); 16 17 users.add(user); 18 users.add(user1); 19 users.add(user2); 20 users.add(user3); 21 users.add(user4); 22 23 for (User user5 : users) { 24 System.out.println(user5.getName() +"===="+ user5.getAge() ); 25 } 26 } 27 }
在控制台输出的结果为
乔丹====21 乔丹====22 欧文====22 艾弗森====24 Zion====62