------- android培訓、java培訓、期待與您交流! ----------
TreeSet集合
TreeSet集合是一個依靠TreeMap實現的有序集合,內部存儲元素是自動按照自然排序進行排列,所以如果想要保留存儲時的順序,那么就不建議使用TreeSet。
TreeSet繼承了Set的特性,也就是不允許有重復元素,他會通過compareTo方法對所有元素進行比較,此方法認為相等的元素就是相同元素。并且TreeSet存儲元素的方式是根據二叉樹的形式,這樣在一定程度上提高了效率,下面我們用一張簡單的圖展示一下TreeSet的存儲原理:
這就是TreeSet存儲元素的基本原理,下面我們用代碼驗證一下元素的值是否是按我們所說的排列:
public static void main(String[] args) { // TODO Auto-generated method stub TreeSet set = new TreeSet(); set.add(24); set.add(30); set.add(12); set.add(16); set.add(24); for (Iterator iterator = set.iterator(); iterator.hasNext();) { System.out.PRintln(iterator.next()); } }
好了,程序運行的結果和我們所說的是一樣的,按照自然排序的方法進行排列,這樣直接放入數字或字符串的排列很容易,那么如果我們在集合中存儲的是一個對象呢?我們先來看一段代碼:
public static void main(String[] args) { TreeSet<Student> set = new TreeSet<Student>(); set.add(new Student("張三",20)); set.add(new Student("李四",19)); set.add(new Student("王五",23)); set.add(new Student("啊啊",16)); set.add(new Student("趙六",25)); for(Iterator<Student> it = set.iterator();it.hasNext();){ Student stu = (Student)it.next(); System.out.println(stu.getName()+stu.getAge()); } }
如果直接運行這段代碼,我們會發現他報出了一個Student cannot be cast to java.lang.Comparable的錯誤,也就是說Student類不能比較值,我們知道數字可以比較大小,字母或漢字也可以根據一定順序排列先后,可是如果你直接給TreeSet一個類,他就蒙了,他會很疑惑你到底讓他比較什么呢。那么我們就需要通過自己手動給他一個比較方案,也就是讓Student類實現Comparable接口中的compareTo方法,這個方法的返回值類型是一個int類型,通過查看API我們可以發現如果該方法返回0,就是值相同,如果返回-1就是小于,如果返回的是一個正整數,就是大于,好了我們知道了他的比較原理,現在就可以輕松的實現這個方法了。
class Student implements Comparable{ private String name; private int age; public Student(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Object o) { if(!(o instanceof Student)){ throw new RuntimeErrorException(null, "不是學生對象!"); } Student stu = (Student)o; if(stu.getAge()>this.age){ return 1; }else if(stu.getAge()<this.age){ return -1; }else{ return this.name.compareTo(stu.getName()); } }}
這樣就實現了一個通過年齡排序的方法,并且如果年齡相同,會按照姓名的先后排序。compareTo的Object參數表示的是集合中的下一個元素,需要先通過轉換再進行比較,如果不是相同類,那么拋出異常。
在上面我們說到TreeSet集合會通過compareTo方法進行比較,那么在我們這段程序中,如果有相同姓名和年齡的Student那么就不會添加到集合中。
下面我們再考慮一種場景,比如在公司中上面這段代碼別人已經寫好了,而我們又需要另一種排序方式,比如按姓名排序,那么怎么辦呢?我們總不能去修改別人寫好的代碼吧,這時候我們就需要通過實現Comparator接口來實現compare方法,再將這個實現類通過構造函數傳遞給TreeSet就OK了,要注意的是compare方法的返回值依舊是int,他的兩個參數都是Object類型,分別代表了當前元素和后一個元素。
class Comp implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); }}//在main方法中 TreeSet<Student> set = new TreeSet<Student>(new Comp());
這樣就實現了自定義的排序方法。
新聞熱點
疑難解答