国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

黑馬程序員【TreeSet集合】

2019-11-15 00:19:45
字體:
來源:轉載
供稿:網友
黑馬程序員【TreeSet集合】

------- 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());

這樣就實現了自定義的排序方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉木乃县| 始兴县| 宝鸡市| 雷山县| 富锦市| 昭觉县| 五河县| 中卫市| 阳江市| 博湖县| 交口县| 枣阳市| 福鼎市| 镇康县| 得荣县| 沾化县| 阳信县| 长葛市| 大冶市| 新昌县| 晋宁县| 梅州市| 柏乡县| 梓潼县| 乌兰察布市| 鹤峰县| 原平市| 普宁市| 五指山市| 星座| 卢湾区| 阿鲁科尔沁旗| 鹰潭市| 大埔县| 阜城县| 剑川县| 岐山县| 白银市| 曲靖市| 安龙县| 迁安市|