您好,登錄后才能下訂單哦!
TreeSet中怎么實現子類排序操作,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
經過分析后發現,TreeSet子類中保存的數據是允許排序的,但是這個類必須要實現Comparable接口,只有實現了此接口才能夠確認出對象的大小關系。
提示:TreeSet本質上是利用TreeMap子類實現的集合數據的存儲,而TreeMap(樹)就需要根據Comparable來確定對象的大小關系。
那么下面就使用一個自定義的類來實現排序的處理操作。
范例:使用自定義的類實現排序的處理操作
import java.util.Set;import java.util.TreeSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception { Set<Person> all=new TreeSet<Person>(); all.add(new Person("張三",19)); all.add(new Person("李四",19)); //年齡相同,但姓名不同all.add(new Person("王五",20)); //數據重復all.add(new Person("王五",20)); //數據重復all.add(new Person("小強",78)); all.forEach(System.out::println); } }class Person implements Comparable<Person>{ //比較器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 * 姓名:小強、年齡:78 */
在使用自定義類對象進行比較處理的時候,一定要將該類中所有屬性都依次進行大小關系的匹配,否則某一個或者幾個屬性相同的時候也會被認為是重復數據,所以TreeSet是利用了Comparable接口來確認重復數據的。
由于TreeSet在操作過程之中需要將類中的所有屬性進行比對,這樣的實現難度太高了,那么在實際的開發中應該首選HashSet子類進行存儲。
TreeSet類是利用了Comparable接口來實現了重復元素的判斷,但是Set集合的整體特征就是不允許保存重復元素。但是HashSet判斷重復元素的方式并不是利用Comparable接口完成的,它利用的是Object類中提供的方法實現的:
對象編碼:public int hashCode();
對象比較:public boolean equals(Object obj);
在進行重復元素判斷的時候首先利用hashCode()進行編碼的匹配,如果該編碼不存在,則表示數據不存在,證明沒有重復,如果該編碼存在,則進一步進行對象比較處理,如果發現重復了,則此數據是不允許保存的。如果使用的是Eclipse開發工具,則可以幫助開發者自動創建HashCode()與equals()方法。
范例:實現重復元素處理
import java.util.Set;import java.util.HashSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception {Set<Person> all=new TreeSet<Person>();all.add(new Person("張三",19));all.add(new Person("李四",19)); //年齡相同,但姓名不同all.add(new Person("王五",20)); //數據重復all.add(new Person("王五",20)); //數據重復all.add(new Person("小強",78));all.forEach(System.out::println); } }class Person implements Comparable<Person>{ //比較器 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); } } }/** * 姓名:小強、年齡:78 * 姓名:李四、年齡:19 * 姓名:王五、年齡:20 * 姓名:張三、年齡:19 */
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。