这篇,我们接着前面的代码,来做两个练习,熟悉下TreeSet遍历自定义类对象的基本操作。上面一篇,我们介绍了根据age来排序输出集合元素,这篇第一个练习,我们来看看如何根据name来排序,了解下字符排序的原理是什么。
1.TreeSet存储自定义对象并按照姓名排序
自定义类Person.java内容如下
package bean;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
super();
}
public Person(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
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
/*
@Override
public int compareTo(Person o) {
int num = this.age - o.age;
return num==0? this.name.compareTo(o.name):num; //年龄作为第一个比较条件,姓名作为第二个
}*/
@Override
public int compareTo(Person o) {
int num = this.name.compareTo(o.name);
return num==0? this.age - o.age:num; //姓名作为第一个比较条件,年龄作为第二个
}
}
在测试类中添加自定义对象,打印输出效果。
package treeset;
import java.util.TreeSet;
import bean.Person;
public class Demo1_TreeSet {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("张三",23));
ts.add(new Person("李四",24));
ts.add(new Person("刘六",14));
ts.add(new Person("王五",29));
System.out.println(ts);
}
}
输出:
[Person [name=刘六, age=14], Person [name=张三, age=23], Person [name=李四, age=24], Person [name=王五, age=29]]
这输出效果,并看不出是按照什么规则排序。上面来看,肯定不是笔画顺序和第一个中文的拼音首字母排序。答案是根据第一个字符的unicode的大小排序。不信,你添加下面代码试试。
package treeset;
import java.util.TreeSet;
import bean.Person;
public class Demo1_TreeSet {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("张三",23));
ts.add(new Person("李四",24));
ts.add(new Person("刘六",14));
ts.add(new Person("王五",29));
System.out.println(ts);
System.out.println('张'+0);
System.out.println('李'+0);
System.out.println('刘'+0);
System.out.println('王'+0);
}
}
输出:
[Person [name=刘六, age=14], Person [name=张三, age=23], Person [name=李四, age=24], Person [name=王五, age=29]]
24352
26446
21016
29579
上面分别打印出了,‘张’,‘刘’,‘李’,‘王’四个字符在unicode码表中的值,所以上面根据名称排序,实际是根据第一个字符在unicode的码表位置大小排序的。
2.按照姓名的长度去排序
重写compareTo方法后代码如下
package bean;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
super();
}
public Person(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
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
/*
@Override
public int compareTo(Person o) {
int num = this.age - o.age;
return num==0? this.name.compareTo(o.name):num; //年龄作为第一个比较条件,姓名作为第二个
}*/
/*
@Override
public int compareTo(Person o) {
int num = this.name.compareTo(o.name);
return num==0? this.age - o.age:num; //姓名作为第一个比较条件,年龄作为第二个
}*/
@Override
public int compareTo(Person o) {
int length = this.name.length() - o.name.length(); //比较长度为主要条件
int num = length ==0 ? this.name.compareTo(o.name) : length; //比较姓名为次要条件
return num ==0 ? this.age - o.age : num; //比较年龄为次要条件
}
}
上面,主要的条件是姓名的长度,第二个次要条件是姓名unicode字典顺序比较,第三个条件是年龄大小比较。下面我们写一些姓名长度相同,unicode不同,年龄不同的数据来测试下。
package treeset;
import java.util.TreeSet;
import bean.Person;
public class Demo1_TreeSet {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("zhangsan",23));
ts.add(new Person("lisi",24));
ts.add(new Person("liuliu",14));
ts.add(new Person("wangwu",29));
ts.add(new Person("aaaa",29));
ts.add(new Person("bbbbbb",29));
System.out.println(ts);
}
}
运行输出:
[Person [name=aaaa, age=29], Person [name=lisi, age=24], Person [name=bbbbbb, age=29], Person [name=liuliu, age=14], Person [name=wangwu, age=29], Person [name=zhangsan, age=23]]