TreeSet中怎么實現(xiàn)子類排序操作,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站專注于電白企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站制作。電白網(wǎng)站建設(shè)公司,為電白等地區(qū)提供建站服務(wù)。全流程按需定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
經(jīng)過分析后發(fā)現(xiàn),TreeSet子類中保存的數(shù)據(jù)是允許排序的,但是這個類必須要實現(xiàn)Comparable接口,只有實現(xiàn)了此接口才能夠確認(rèn)出對象的大小關(guān)系。
提示:TreeSet本質(zhì)上是利用TreeMap子類實現(xiàn)的集合數(shù)據(jù)的存儲,而TreeMap(樹)就需要根據(jù)Comparable來確定對象的大小關(guān)系。
那么下面就使用一個自定義的類來實現(xiàn)排序的處理操作。
范例:使用自定義的類實現(xiàn)排序的處理操作
import java.util.Set;import java.util.TreeSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception { Setall=new TreeSet (); all.add(new Person("張三",19)); all.add(new Person("李四",19)); //年齡相同,但姓名不同all.add(new Person("王五",20)); //數(shù)據(jù)重復(fù)all.add(new Person("王五",20)); //數(shù)據(jù)重復(fù)all.add(new Person("小強(qiáng)",78)); all.forEach(System.out::println); } }class Person implements Comparable { //比較器private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age; }public String toString() {return "姓名:" + this.name + "、年齡:" + this.age; } @Overridepublic int compareTo(Person per) {if(this.age < per.age){return -1 ; }else if(this.age > per.age) {return 1; }else {return this.name.compareTo(per.name); } } }/** * 姓名:張三、年齡:19 * 姓名:李四、年齡:19 * 姓名:王五、年齡:20 * 姓名:小強(qiáng)、年齡:78 */
在使用自定義類對象進(jìn)行比較處理的時候,一定要將該類中所有屬性都依次進(jìn)行大小關(guān)系的匹配,否則某一個或者幾個屬性相同的時候也會被認(rèn)為是重復(fù)數(shù)據(jù),所以TreeSet是利用了Comparable接口來確認(rèn)重復(fù)數(shù)據(jù)的。
由于TreeSet在操作過程之中需要將類中的所有屬性進(jìn)行比對,這樣的實現(xiàn)難度太高了,那么在實際的開發(fā)中應(yīng)該首選HashSet子類進(jìn)行存儲。
TreeSet類是利用了Comparable接口來實現(xiàn)了重復(fù)元素的判斷,但是Set集合的整體特征就是不允許保存重復(fù)元素。但是HashSet判斷重復(fù)元素的方式并不是利用Comparable接口完成的,它利用的是Object類中提供的方法實現(xiàn)的:
對象編碼:public int hashCode();
對象比較:public boolean equals(Object obj);
在進(jìn)行重復(fù)元素判斷的時候首先利用hashCode()進(jìn)行編碼的匹配,如果該編碼不存在,則表示數(shù)據(jù)不存在,證明沒有重復(fù),如果該編碼存在,則進(jìn)一步進(jìn)行對象比較處理,如果發(fā)現(xiàn)重復(fù)了,則此數(shù)據(jù)是不允許保存的。如果使用的是Eclipse開發(fā)工具,則可以幫助開發(fā)者自動創(chuàng)建HashCode()與equals()方法。
范例:實現(xiàn)重復(fù)元素處理
import java.util.Set;import java.util.HashSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception {Setall=new TreeSet ();all.add(new Person("張三",19));all.add(new Person("李四",19)); //年齡相同,但姓名不同all.add(new Person("王五",20)); //數(shù)據(jù)重復(fù)all.add(new Person("王五",20)); //數(shù)據(jù)重復(fù)all.add(new Person("小強(qiáng)",78));all.forEach(System.out::println); } }class Person implements Comparable { //比較器 private String name; private int age;public Person(String name, int age) { this.name = name; this.age = age; } @Overridepublic int hashCode() { final int prime = 31;int result = 1; result = prime * result +age; result = prime * result + ((name == null)? 0 : name.hashCode());return result; } @Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false; Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false; }else if (!name.equals(other.name))return false;return true; }public String toString() {return "姓名:" + this.name + "、年齡:" + this.age; } @Overridepublic int compareTo(Person per) {if(this.age < per.age){return -1 ; }else if(this.age > per.age) {return 1; }else {return this.name.compareTo(per.name); } } }/** * 姓名:小強(qiáng)、年齡:78 * 姓名:李四、年齡:19 * 姓名:王五、年齡:20 * 姓名:張三、年齡:19 */
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。