您的位置:首页 > 编程语言 > Java开发

Java -- 排序03(TreeSet 和 TreeMap)

2017-05-14 09:29 369 查看
Java – 排序03(TreeSet 和 TreeMap)

一.TreeSet
1.特性:数据元素可以排序,但不可重复
2.对比:与HashSet相比,TreeSet不用重写Hashcode和equals
3.去重:比较等于0即重复
4.排序:与上一章中提到的一样,要么用Comparable,要么用Comparator,代码如下
注:TreeSet是在添加数据的时候排序,修改数据后不改变排序
可以将属性常量化,这样就可以避免修改数据的情况发生

(1)运用Comparator


public class Person {
String name;
int handsome;

public Person(String name, int handsome) {
this.name = name;
this.handsome = handsome;
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("姓名: " +  name);
sb.append("帅气指数:" + handsome);
sb.append("\n");
return sb.toString();
}
}
public class Test01 {
public static void main(String[] args) {
Person per1 = new Person("soledad",100000);
Person per2 = new Person("刘德华",1000);
Person per3 = new Person("梁朝伟",10000);

//用Comparator来解决,按帅气指数降序排序
TreeSet<Person> persons = new TreeSet<Person>(
new Comparator<Person>(){
@Override
public int compare(Person o1, Person o2) {
return -(o1.handsome - o2.handsome) ;
}
}
);
persons.add(per1);
persons.add(per2);
persons.add(per3);

System.out.println(persons.toString());
per1.handsome = -100;
System.out.println("==============================================");
System.out.println(persons.toString());
}
}
打印结果:
[姓名: soledad帅气指数:100000
, 姓名: 梁朝伟帅气指数:10000
, 姓名: 刘德华帅气指数:1000
]
=========================================================================
[姓名: soledad帅气指数:-100
, 姓名: 梁朝伟帅气指数:10000
, 姓名: 刘德华帅气指数:1000
]


(2)运用Comparable


public class Worker implements Comparable<Worker> {
String type;
double salary;

public Worker() {
}

public Worker(String type, double salary) {
this.type = type;
this.salary = salary;
}

@Override
public int compareTo(Worker worker) {
return -(this.salary > worker.salary ? 1 :(this.salary == worker.salary) ? 0: -1);
}

@Override
public String toString() {
return "Worker{" +
"type='" + type + '\'' +
", salary=" + salary +
'}';
}
}
public class Test02 {
public static void main(String[] args) {
//按照工资降序排列
Worker worker = new Worker("程序员",10000);
Worker worker2 = new Worker("律师",20000);
Worker worker3 = new Worker("会计师",30000);

TreeSet<Worker> workers = new TreeSet<Worker>();
workers.add(worker);
workers.add(worker2);
workers.add(worker3);

System.out.println(workers.toString());

}
}
打印:
[Worker{type='会计师', salary=30000.0}, Worker{type='律师', salary=20000.0}, Worker{type='程序员', salary=10000.0}]


以上结果表明,TreeSet是在添加数据的时候排序,修改数据后不改变排序
不过,可以将属性常量化(final),这样就可以避免修改数据的情况发生


二.TreeMap

1.特性:确保键(key)可以排序,或者提供比较器
(1)确保key可以排序
(2)提供key比较器
比较方法同TreeSet一样,分为Comparator和Comparable


public class TreeMap01 {
public static void main(String[] args) {
Person per1 = new Person("soledadv",100000);
Person per2 = new Person("刘德华",1000);
Person per3 = new Person("梁朝伟",10000);

//用提供额外的业务类的方法对TreeMap进行比较,按帅气指数降序排列
TreeMap<Person, String> persons = new TreeMap<Person,String>(
new Comparator<Person>(){
@Override
public int compare(Person o1, Person
4000
o2) {
return -(o1.handsome - o2.handsome);
}
}
);
persons.put(per1,"大帅哥");
persons.put(per2,"大帅哥");
persons.put(per3,"大帅哥");

System.out.println(persons.keySet());//查看键的排序

}
}

public class TreeMap02 {
public static void main(String[] args) {
//按照工资降序排列
Worker worker = new Worker("程序员",10000);
Worker worker2 = new Worker("律师",20000);
Worker worker3 = new Worker("会计师",30000);

TreeMap<Worker,String> workers = new TreeMap();
workers.put(worker,"钱多话少死得早");
workers.put(worker2,"钱多话少死得早");
workers.put(worker3,"钱多话少死得早");

System.out.println(workers.keySet());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java