java中的排序--排序容器_TreeSet与TreeMap
1.TreeSet:数据元素可以排序且不可重复。
对比:
(1)Set接口:HashSet,元素必须重写hashcode和equals方法。
(2)TreeSet:只要可以排序即可。去重:比较等于0即重复。
TreeSet数据排序两种方式:
注意:TreeSet是在添加数据时进行排序,数据更改不会影响原来的顺序,因此不能修改类中数据,否则可能重复。需要在设计类时使用final修饰字段属性,同时不提供相应set、get方法。
1)、若选用无参的new TreeSet()构造器,需要元素本身可以排序方能使用,也即实体类实现java.lang.Comparable接口重写compareTo接口。
(1)新建一个实现java.lang.Comparable接口并重写comparaTo方法的实体类
package top.wfaceboss.caseSort02; public class Worker implements java.lang.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 int compareTo(Worker o) { return this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1); } /** * 重写toString */ @Override public String toString() { return "工种:" + this.type + ",工资:" + this.salary + "\n"; } }
(2)使用无参的new TreeSet()构造器
package top.wfaceboss.caseSort02; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { Worker w1 = new Worker("垃圾回收员", 5000); Worker w2 = new Worker("农工", 2000); Worker w3 = new Worker("程序员", 10000); TreeSet<Worker> employee = new TreeSet<Worker>(); employee.add(w1); employee.add(w2); employee.add(w3); System.out.println(employee); } }
结果为:
2)、若选用带参的new TreeSet(Comparator<? super E> comparator)构造器,需要提供额外的排序业务类(匿名内部类的方式)实现java.util.Comparator接口,重写compare方法。
(1)新建一个没有实现java.lang.Comparable接口的实体类
package top.wfaceboss.caseSort; public class Person { private final String name; private final int hangsome; public Person() { name = null; hangsome = 0; } public Person(String name, int hangsome) { super(); this.name = name; this.hangsome = hangsome; } public String getName() { return name; } public int getHangsome() { return hangsome; } /** * 重写toString方法 */ @Override public String toString() { return "姓名:" + this.name + ",帅气指数:" + this.hangsome + "\n"; } }
(2)使用带参的new TreeSet(Comparator<? super E> comparator)构造器--提供额外的业务排序类(匿名内部类的方式)
package top.wfaceboss.caseSort; import java.util.TreeSet; public class TreeSetDemo01 { public static void main(String[] args) { Person p1 = new Person("小红", 100); Person p2 = new Person("大白", 1000); Person p3 = new Person("小明", 10000); Person p4 = new Person("小黑", 100000); // 依次存放到TreeSet容器中 // 由于Person类没有实现java.lang.Comparable重写compareTo接口 ,因此需要提供额外的业务排序类,否则会出错 TreeSet<Person> persons = new TreeSet<Person>(new java.util.Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getHangsome() - o2.getHangsome(); } }); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); System.out.println(persons); } }
结果为:
2.TreeMapt:键可以排序且不可重复。
其键的排序方式与上述相同。
As you wish.