java中的排序--排序容器_TreeSet與TreeMap
阿新 • • 發佈:2019-01-29
去重 new font static 方式 pan 重復 ima ring
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; } /** * 按工資升序 */ @Overridepublic 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:鍵可以排序且不可重復。
其鍵的排序方式與上述相同。
java中的排序--排序容器_TreeSet與TreeMap