<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # JAVA之旅(二十)—HashSet,自定義存儲對象,TreeSet,二叉樹,實現Comparator方式排序,TreeSet小練習 * * * > 我們繼續說一下集合框架 * Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復 > Set集合的功能和Collection是一致的 ![這里寫圖片描述](http://img.blog.csdn.net/20160624213603921) > 我們重點關注的是子類對象 ![這里寫圖片描述](http://img.blog.csdn.net/20160624213723820) > 我們來聊聊 ## 一.HashSet > HashSet底層結構是哈希表 > > 什么是HashSet? ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { Demo d1 = new Demo(); Demo d2 = new Demo(); sop(d1); sop(d2); } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } class Demo { } ~~~ > 我們這樣輸出的結果就是哈希值 ![這里寫圖片描述](http://img.blog.csdn.net/20160624214048088) > 當然,我們是來介紹HashSet的,我們演示一下 ~~~ package com.lgl.hellojava; import java.util.HashSet; import java.util.Iterator; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { HashSet h = new HashSet(); h.add("hello 01"); h.add("hello 02"); h.add("hello 03"); h.add("hello 04"); // set取出只有一種辦法,迭代器 Iterator iterator = h.iterator(); while (iterator.hasNext()) { sop(iterator.next()); } } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } ~~~ > 是不是很類似,但是輸出,你們仔細看了 ![這里寫圖片描述](http://img.blog.csdn.net/20160624223205013) > 輸出是無序的,我們還有一個現象,就是直接輸出 ~~~ sop(h.add("lgl")); sop(h.add("lgl")); ~~~ > 相同的 ![這里寫圖片描述](http://img.blog.csdn.net/20160624223521454) > 因為他不能重復 ## 二.自定義存儲對象 > 我們可以存數據,那肯定可以自定義存儲數據咯? ~~~ package com.lgl.hellojava; import java.util.HashSet; import java.util.Iterator; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { HashSet h = new HashSet(); h.add(new Person("lgl1", 18)); h.add(new Person("lgl2", 19)); h.add(new Person("lgl3", 20)); h.add(new Person("lgl4", 21)); // set取出只有一種辦法,迭代器 Iterator iterator = h.iterator(); while (iterator.hasNext()) { Person p = (Person) iterator.next(); sop(p.getName() + ":" + p.getAge()); } } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } /** * 存儲對象 * * @author LGL * */ class Person { private String name; private int age; public Person(String name, int age) { this.setName(name); this.setAge(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; } } ~~~ > 這樣就可以定下來了 * HashSet是如何保證元素的唯一性呢?? * 是通過元素的兩個方法,hasCode和equals來完成的 * 如果元素的hasCode相同。才會去判斷equals是否為true * 如果元素的hasCode不同。不會調用equals > 這里要注意一點的就是,對于判斷元素是否存在的話,以及刪除的操作,依賴的方法就是元素的hasCode和equals ## 三.TreeSet > hashSet說完,我們再來看一下TreeSet,我們用小例子來說明 ~~~ package com.lgl.hellojava; import java.util.Iterator; import java.util.TreeSet; import org.omg.PortableInterceptor.Interceptor; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { TreeSet s = new TreeSet(); s.add("abc"); s.add("acd"); s.add("age"); s.add("abf"); Iterator iterator = s.iterator(); while (iterator.hasNext()) { sop(iterator.next()); } } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } ~~~ > 我們仔細看他的輸出 ![這里寫圖片描述](http://img.blog.csdn.net/20160625194505587) > 他會排序,那我們就知道TreeSet的特性了 * 可以對Set集合中的元素進行排序 > 如果你用自定義對象去村粗的話,你會發現他可以存一個對象,但是不能存儲多個對象,為什么?因為他會強制進行排序,如果是對象的話,他沒法排序,是不行的 > > 對了我們沒有講TreeSet的數據結構呢,他的數據結構是二叉樹,這是一個比較難的概念了 ## 四.二叉樹 > 二叉樹其實通俗一點,就是樹形圖數據,比如 ![這里寫圖片描述](http://img.blog.csdn.net/20160625200137314) > 就是比較,一直分支,很大的節約了計算方式,我們比較,大的話,開一個分支,小的話,再開一個分支,就這樣一直比較! > > 那TreeSet保證元素唯一性的是compareTo方法return 0; * TreeSet排序的第一種方式,讓元素自身具備比較性,元素需要實現Comparable 接口,覆蓋compareTo方法,這種也稱為元素的自然順序! ## 五.實現Comparator方式排序 > 當元素不具備比較性時,或者具備的元素的比較性不是所需要的,這時就需要讓集合自身具備比較性,那就是在集合一初始化時就有了比較方式.這么說有點繞啊,我們還是用代碼來說明吧,原理都是二叉樹 ~~~ package com.lgl.hellojava; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 當元素自身不具備比較性或者具備的比較性不是所需要的,這時需要讓容器自生具備比較性,定義一個比較器, * 將比較器對象作為參數傳遞給TreeSet集合的構造函數 */ TreeSet s = new TreeSet(new MyCompare()); s.add(new Student("lgl1", 22)); s.add(new Student("lgl2", 26)); s.add(new Student("lgl3", 10)); s.add(new Student("lgl4", 19)); Iterator iterator = s.iterator(); while (iterator.hasNext()) { Student student = (Student) iterator.next(); sop(student.getName() + ":" + student.getAge()); } } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // 比較 public int compareTo(Object obj) { if (!(obj instanceof Student)) { throw new RuntimeException("不是學生對象"); } Student s = (Student) obj; if (this.age > s.age) { return 1; } else if (this.age == s.age) { return this.name.compareTo(s.name); } return -1; } 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; } } // 定義比較器 class MyCompare implements Comparator { public int compare(Object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return s1.getName().compareTo(s2.getName()); } } ~~~ ## 六.TreeSet小練習 > 我們到這里,就用一個小練習來結束吧,畢竟在后面就需要講泛型了,我們的需求就是按照字符串長度排序 ~~~ package com.lgl.hellojava; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 按照字符串長度排序 */ TreeSet s = new TreeSet(new StringLengthComparator()); s.add("ffffffff"); s.add("fffff"); s.add("ff"); s.add("ffffff"); Iterator iterator = s.iterator(); while (iterator.hasNext()) { sop(iterator.next()); } } // 輸出 public static void sop(Object obj) { System.out.println(obj); } } // 定義比較性 class StringLengthComparator implements Comparator { @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; if (s1.length() > s2.length()) return 1; if (s1.length() == s2.length()) return 0; return -1; } } ~~~ > 這樣就OK了,輸出的結果 ![這里寫圖片描述](http://img.blog.csdn.net/20160625205043694) > 這樣就O了,好的,但是我們重復元素也會被干掉的,這時候我們就要處理了 ~~~ @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); if (num == 0) { return s1.compareTo(s2); } return -num; } ~~~ > 到這里,就基本上都搞定了,我們的博文到這里也結束了,如果有機會 ## 可以加群討論:555974449 版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看