来源:http://www.bjsxt.com/
1、S02E127_01排序容器_TreeSet与TreeMap
(1)TreeSet:数据元素可以排序且不可重复
对比:Set接口子类HashSet,元素必须重写hashcode和equals方法。
去重:不用重写hashcode和equals方法,比较等于0即重复。
实现:两种
——元素实体可以排序:java.lang.Comparable + compareTo
new TreeSet()时体现
package com.test.sort.collection;
import java.util.TreeSet;
public class Worker implements Comparable<Worker>{
private String type;//工种
private double salary;//工资
public Worker() {
}
public Worker(String type, double salary) {
super();
this.type = type;
this.salary = salary;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "工种:" + type + ",工资:" + salary + "\n";
}
@Override
public int compareTo(Worker o) {
return (this.salary-o.salary>0) ? 1 : (this.salary==o.salary?0:-1);
}
public static void main(String[] args) {
Worker worker1 = new Worker("垃圾回收员", 12000);
Worker worker2 = new Worker("农民工", 10000);
Worker worker3 = new Worker("程序猿", 5000);
TreeSet<Worker> workers = new TreeSet<Worker>();
workers.add(worker1);
workers.add(worker2);
workers.add(worker3);
System.out.println(workers.toString());
}
}
——排序业务类:java.util.Comparator + compare
new TreeSet(Comparator<? super E> comparator)时体现
注意:TreeSet在添加数据时排序,数据更改不会影响原来的顺序。不要修改数据,否则可能重复(加final可使数据不可修改)
package com.test.sort.collection;
import java.util.Comparator;
import java.util.TreeSet;
public class Person {
private final String name;//姓名/加final用于不可修改,因为修改可能使用数据重复
private final int handsome;//帅气指数/加final用于不可修改,因为修改可能使用数据重复
public Person() {
name = null;
handsome = 0;
}
public Person(String name, int handsome) {
super();
this.name = name;
this.handsome = handsome;
}
public String getName() {
return name;
}
public int getHandsome() {
return handsome;
}
@Override
public String toString() {
return "姓名:" + name + ",帅气指数:" + handsome + "\n";
}
public static void main(String[] args) {
Person p1 = new Person("你", 100);
Person p2 = new Person("刘德华", 1000);
Person p3 = new Person("梁朝伟", 1200);
Person p4 = new Person("老师", 50);
//使用排序的业务类(匿名内部类)
TreeSet<Person> persons = new TreeSet<Person>(
new Comparator<Person>() {
public int compare(Person o1, Person o2) {
return o1.getHandsome() - o2.getHandsome();
};
}
);
persons.add(p1);
//TreeSet在添加数据时排序,不是添加完才排序
persons.add(p2);
persons.add(p3);
persons.add(p4);
System.out.println(persons.toString());
/*属性不加fina前
//数据更改不会影响原来的顺序
p4.setHandsome(100);
p4.setName("你");
//p4与p1内容重复,即TreeSet数据存在重复
System.out.println(persons.toString());
*/
}
}
(2)TreeMap:确保key可以排序或者提供比较器
——key可以排序
public TreeMap()时体现
与TreeSet同理
//使用排序的业务类(匿名内部类)
TreeMap<Person2,String> persons = new TreeMap<Person2,String>(
new Comparator<Person2>() {
public int compare(Person2 o1, Person2 o2) {
return o1.getHandsome() - o2.getHandsome();
};
}
);
persons.put(p1,"a");
persons.put(p2,"a");
persons.put(p3,"a");
persons.put(p4,"a");
System.out.println(persons.toString());
——提供key比较器
public TreeMap(Comparator<? super K> comparator)时体现
与TreeSet同理
TreeMap<Worker2,String> workers = new TreeMap<Worker2,String>();
workers.put(worker1,"a");
workers.put(worker2,"a");
workers.put(worker3,"a");
System.out.println(workers.toString());