<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ### Set集合介紹 #### Set集合怎么定義呢? 從概念角度去理解,set集合也叫set列表,存儲的元素**無序不可重復**。 * 無序,存入和取出的順序不一定一致([`LinkedHashSet`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-linked-hash-set/index.html)比較特殊,它保留元素插入的順序); * 不可重復,不可以存儲重復數據,如果存儲的數據有重復值,只有保留一個元素。 我們經常利用“不可重復”特性對數據源進行“去重操作”。從代碼角度去理解,Set集合由Set接口和Set接口的實現類組成。 #### Set接口常用的實現類有哪些? HashSet、TreeSet(Java獨有,Kotlin沒有)和MutableSet。 HashSet不保證Set的迭代順序,不保證順序恒久不變。允許使用null元素。 HashSet遍歷集合的時候,按照自然順序遞增的排序,也可以制定比較器。 #### Set集合可以存儲什么類型數據呢? Set集合可以存儲各種類型數據。可以存儲諸如Int、Double、String等基本數據類型,也可以存儲其他自定義對象類型,比如自定義的學生Student。 ### Set集合3種創建方式 相比于List集合,**Set接口沒有提供構造方法,所以,不能通過Set的構造方法創建Set集合**。 在Kotlin中創建Set集合有4種方式,通過Kotlin給我們封裝好的3個方法創建或者直接調用TreeSet的構造方法。如下表格,我們將這四種方式列舉了出來。 | **創建set集合方法** | **返回值類型** | **是否可寫** | **是否有序** | | --------------------- | ---------- | -------- | -------- | | **setOf ()方法** | Set | 否 | 無 | | **hashSetOf ()方法** | HashSet | 是 | 無 | | **mutableSetOf ()方法** | MutableSet | 是 | 無 | | **TreeSet構造方法(Java獨有的)** | TreeSet | 是 | 有 | 我們可以直接看3種方式的對應方法的方法簽名,重點看返回值,方法體的部分我直接去掉了,對應的源碼如下: ``` //方式一 public fun<T> setOf(vararg elements: T): Set<T>{} //方式二 public fun<T> hashSetOf(vararg elements: T): HashSet<T>{} //方式三 public fun<T> mutableSetOf(vararg elements: T): MutableSet<T>{} //方式四:必須要引入包:java.util.* public TreeSet(){} ``` 作為了解,可以通過翻看源碼得知4種創建集合方式上的細微差別,有的是通過Java里面的HashSet創建,有的是通過toSet方法轉換為的set集合。這個意義不是很大。 更重要的是需要知道,通過setOf方法創建的set集合是不可寫的,通過hashSetOf方法、mutableSetOf方法、TreeSet構造方法創建的集合是可寫的。具體使用的時候,忘記是否可寫怎么辦?只需要點進去看看方法的返回值即可,返回Set不可寫,返回HashSet、MutableSet則可寫。或者,看每個方法的注釋,返回只讀的set集合,會出現“**read-only** **set**”字樣。比如,我們查看setOf方法的源碼注釋: ~~~ /** * Returns a new read-only set with the given elements. * Elements of the set are iterated in the order they were specified. * The returned set is serializable (JVM). * @sample samples.collections.Collections.Sets.readOnlySet */ public fun <T> setOf(vararg elements: T): Set<T> = if (elements.size > 0) elements.toSet() else emptySet() ~~~ 我們通過代碼演示集合的4種創建方式: ~~~ fun main(args: Array<String>) { val set = setOf("a", "b", "c") println(set) val set1 = hashSetOf(1, 2, 3) println(set1) val set2 = mutableSetOf("a", "b", 3) println(set2) val set3 = TreeSet<String>() set3.add("a") set3.add("b") set3.add("c") println(set3) } ~~~ 運行結果 ``` [a, b, c] [1, 2, 3] [a, b, 3] [a, b, c] Process finished with exit code 0 ``` ### Set集合的可寫性驗證以及轉換 我們通過代碼驗證集合是否可寫,先驗證集合可寫,參考代碼: ~~~ fun main(args: Array<String>) { val set = setOf("a", "b", "c") //set.add(4)//這里報錯,說明不可寫 println(set) val set1 = hashSetOf(1, 2, 3) set1.add(4)//可寫 println(set1) val set2 = mutableSetOf("a", "b", 3) set2.add(4)//可寫 println(set2) val set3 = TreeSet<String>() set3.add("a") set3.add("b") set3.add("c") set3.add("love") println(set3) } ~~~ 運行結果 ``` [a, b, c] [1, 2, 3, 4] [a, b, 3, 4] [a, b, c, love] Process finished with exit code 0 ``` 但是,不可寫集合可以通過toMutableSet轉換為可寫集合,然后在進行寫操作,參考代碼: ~~~ fun main(args: Array<String>) { val set = setOf("a", "b", "c") //set.add(4)//這里報錯,說明不可寫 set.toMutableSet().add("truth")//不可寫轉可寫 println(set)//為啥輸出結果是[a, b, c],原因和上一節list的一樣 } ~~~ 運行結果 ``` [a, b, c] Process finished with exit code 0 ``` ### Set集合數據不可重復 Set集合中的元素不可重復,是set相對于List的一個重要特點。同時,Set集合中可以存儲null元素,我們通過一個案例驗證下Set集合不可以包含重復元素,參考代碼: ~~~ fun main(args: Array<String>) { //set集合數據不可重復,會自動去重 val set4 = setOf(1, 1, 2, 2, 5, null, null) println(set4) } ~~~ 運行結果 ``` [1, 2, 5, null] Process finished with exit code 0 ``` ### Set集合數據無序 我們常說Set集合無序,應該怎么去理解呢?就是我們的Set接口,不保證加入和取出順序一致。但是子接口會做一些保證。 * HashSet內部存儲的時候會根據元素的hashCode排序,元素取出的時候無序。 * LinkedHashSet內部存儲的時候也會根據元素的hashCode排序,但是使用鏈表存儲,元素取出順序和插入順序一致。 * TreeSet內部存儲按照自然順序對元素排序,但是對開發者不可見。 我們通過例子,演示下,Set集合的無序性: ~~~ fun main(args: Array<String>) { //內部使用HashSet無序 val set = hashSetOf("T桃子", "J橘子", "X杏子", "P蘋果", "L梨", "S山楂", "G甘蔗", "M獼猴桃", "X香蕉") println("set:${set}") //內部使用LinkedHashSet,存儲按照hashCode,輸出按照輸入順序 val set1 = setOf("T桃子", "J橘子", "X杏子", "P蘋果", "L梨", "S山楂", "G甘蔗", "M獼猴桃", "X香蕉") println("set1:${set1}") //內部使用LinkedHashSet,存儲按照hashCode,輸出按照輸入順序 val set2 = mutableSetOf("T桃子", "J橘子", "X杏子", "P蘋果", "L梨", "S山楂", "G甘蔗", "M獼猴桃", "X香蕉") println("set2:${set2}") //TreeSet自然順序 val set3 = TreeSet<String>() set3.add("T桃子") set3.add("J橘子") set3.add("X杏子") set3.add("P蘋果") set3.add("L梨") set3.add("S山楂") set3.add("G甘蔗") set3.add("M獼猴桃") set3.add("X香蕉") println("set3:${set3}") } ~~~ 運行結果 ``` set:[P蘋果, M獼猴桃, X杏子, S山楂, G甘蔗, J橘子, L梨, X香蕉, T桃子] set1:[T桃子, J橘子, X杏子, P蘋果, L梨, S山楂, G甘蔗, M獼猴桃, X香蕉] set2:[T桃子, J橘子, X杏子, P蘋果, L梨, S山楂, G甘蔗, M獼猴桃, X香蕉] set3:[G甘蔗, J橘子, L梨, M獼猴桃, P蘋果, S山楂, T桃子, X杏子, X香蕉] Process finished with exit code 0 ``` 針對以上代碼我們看到set是無序輸出。set1和set2則按照插入順序輸出。set3按照自然順序輸出(最具實際開發意義)。 ### Set集合遍歷 前面我們學習了區間、數組、List集合的遍歷。那如何遍歷Set集合呢?Set集合的遍歷和List、數組的遍歷一樣。 也就是Set集合在遍歷的時候,可以普通的for循環,還可以for循環的時候調用withIndex方法,參考代碼: ~~~ fun main(args: Array<String>) { val set = setOf(1, 1, 2, 2, 3, 3, 4, 4, 5, 5) println("--------普通的for循環遍歷---------") for (c in set) { println(c) } println("--------for循環遍歷 withIndex---------") for (withIndex in set.withIndex()) { println("${withIndex.index}->${withIndex.value}") } println("--------for循環遍歷 解析析構---------") for ((index, value) in set.withIndex()) { println("${index}->${value}") } } ~~~ 運行結果 ``` --------普通的for循環遍歷--------- 1 2 3 4 5 --------for循環遍歷 withIndex--------- 0->1 1->2 2->3 3->4 4->5 --------for循環遍歷 解析析構--------- 0->1 1->2 2->3 3->4 4->5 Process finished with exit code 0 ``` 當然,還可以通過高階函數進行遍歷操作,這個我們后續再去講解。
                  <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>

                              哎呀哎呀视频在线观看