這篇文章主要介紹“Swift 中怎么進(jìn)行多重條件排序”,在日常操作中,相信很多人在Swift 中怎么進(jìn)行多重條件排序問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Swift 中怎么進(jìn)行多重條件排序”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

在通化等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營(yíng)銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,通化網(wǎng)站建設(shè)費(fèi)用合理。
在一個(gè)條件或者單個(gè)屬性上進(jìn)行排序非常簡(jiǎn)單, Swift 本身就有相關(guān)的功能。
下面是對(duì) int 數(shù)組進(jìn)行排序的例子:
let numbers = [3, 5, 6, 1, 8, 2]          let sortedNumbers = numbers.sorted { (lhs, rhs) in     return lhs < rhs }  // [1, 2, 3, 5, 6, 8]但有時(shí)我們需要根據(jù)多個(gè)條件或?qū)傩詠磉M(jìn)行排序。為了演示這一點(diǎn),我們創(chuàng)建一個(gè)結(jié)構(gòu)體來作為示例。
這里我們有一個(gè)簡(jiǎn)單的 BlogPost 結(jié)構(gòu)體,它包含帖子標(biāo)題和兩個(gè)統(tǒng)計(jì)數(shù)據(jù),即瀏覽次數(shù)pageView和會(huì)話持續(xù)時(shí)間sessionDuration。
struct BlogPost {     let title: String     let pageView: Int     let sessionDuration: Double }Sample 數(shù)據(jù):
extension BlogPost {     static var examples: [BlogPost] = [         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3),         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2),         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1),         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2),         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10)     ] }如果您想查看哪些文章表現(xiàn)良好,可以按照瀏覽次數(shù)對(duì)它們直接進(jìn)行排序。但是很多帖子都不那么流行,頁面瀏覽量也一樣。在這種情況下,需要根據(jù)另一個(gè)條件或?qū)傩詠磉M(jìn)行進(jìn)一步的排序。
我們將在本文中討論這種多屬性排序。他們有各種各樣的方法來解決這個(gè)問題。我將展示沒有任何復(fù)雜概念的最基本的方法。一旦你了解了基本原理,你就可以隨心所欲地進(jìn)階了。
多條件排序是指我們比較第一個(gè)條件的排序,只有當(dāng)?shù)谝粋€(gè)條件相等時(shí),我們才轉(zhuǎn)到下一個(gè)條件。我們這樣做直到找到一個(gè)不相等的條件。
偽代碼如下所示:
let sortedObjects = objects.sorted { (lhs, rhs) in     for (lhsCriteria, rhsCriteria) in [(lhsCrtria1, rhsCriteria1), (lhsCrtria2, rhsCriteria2), (lhsCrtria3, rhsCriteria3), ... , (lhsCrtriaN, rhsCriteriaN)] { // <1>         if lhsCriteria == rhsCriteria { // <2>             continue         }         return lhsCriteria < rhsCriteria // <3>     } }<1> 我們從最重要的一個(gè)(也就是第一個(gè))開始,循環(huán)遍歷條件列表。
<2> 如果這個(gè)順序條件相等,我們不能根據(jù)它來決定順序,就跳到下一個(gè)條件。
<3> 如果我們可以根據(jù)條件決定兩個(gè)對(duì)象之間的順序,我們就停止并返回結(jié)果。
如果你很難理解偽代碼,不用擔(dān)心。我不是一個(gè)偽代碼專業(yè)作家。下面的例子應(yīng)該更清楚一點(diǎn)。
我們使用前面提到的場(chǎng)景,我們希望根據(jù)表現(xiàn)對(duì)BlogPost進(jìn)行排序。
我們的表現(xiàn)取決于頁面瀏覽次數(shù)pageView,如果瀏覽次數(shù)相同,我們?cè)倏磗essionDuration。
下面是上一個(gè)例子中用到的BlogPost結(jié)構(gòu)體和對(duì)應(yīng)的sample數(shù)據(jù)。
struct BlogPost {     let title: String     let pageView: Int     let sessionDuration: Double }  extension BlogPost {     static var examples: [BlogPost] = [         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3),         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2),         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1),         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2),         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10)     ] }我們衡量表現(xiàn)的方法可以翻譯成下面這樣的代碼:
let popularPosts = BlogPost.examples.sorted { (lhs, rhs) in if lhs.pageView == rhs.pageView { // <1> return lhs.sessionDuration > rhs.sessionDuration }    return lhs.pageView > rhs.pageView // <2> }<1>如果博客文章有相同的訪問次數(shù),我們使用訪問時(shí)間。
<2>如果訪問次數(shù)不相等,我們可以直接根據(jù)訪問次數(shù)來排序(我們使用降序)
排序的結(jié)果:
[BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0), BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0), BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0), BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0), BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)]
不難發(fā)現(xiàn),根據(jù)兩個(gè)條件來排序非常簡(jiǎn)單。讓我們引入更多的條件。如果博客文章的表現(xiàn)相同,我們按照title排序。
添加更多的sample數(shù)據(jù):
extension BlogPost {     static var examples2: [BlogPost] = [         BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2),         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3),         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2),         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1),         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2),         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10),         BlogPost(title: "Angero", pageView: 1, sessionDuration: 2)     ] }兩個(gè)條件和三個(gè)條件沒什么區(qū)別,我們可以沿用相同的邏輯:
let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in     if lhs.pageView == rhs.pageView {         if lhs.sessionDuration == rhs.sessionDuration { // <1>             return lhs.title < rhs.title         }                  return lhs.sessionDuration > rhs.sessionDuration     }          return lhs.pageView > rhs.pageView }<1> 我們添加了另一個(gè)if來檢查博客文章是否具有相同的會(huì)話持續(xù)時(shí)間,如果它們具有相同的頁面瀏覽次數(shù)和會(huì)話持續(xù)時(shí)間,則按標(biāo)題對(duì)它們進(jìn)行排序。
排序結(jié)果:
[BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0), BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2.0), BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0), BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0), BlogPost(title: "Angero", pageView: 1, sessionDuration: 2.0), BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0), BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)]
我們可以對(duì)兩個(gè)和三個(gè)條件使用相同的邏輯。這里唯一的問題是,條件越多,需要的嵌套就越多。
這是一個(gè)多條件的例子,可能會(huì)導(dǎo)致pyramid of doom。
let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in     if lhs.pageView == rhs.pageView {         if lhs.sessionDuration == rhs.sessionDuration {              if lhs.nextCriteria == rhs.nextCriteria {                  if lhs.nextCriteria == rhs.nextCriteria {                      ....                 }                  ...             }              ...         }                  return lhs.sessionDuration > rhs.sessionDuration     }          return lhs.pageView > rhs.pageView }為了避免 pyramid of doom, 我們?cè)倏纯粗暗膫未a:
let sortedObjects = objects.sorted { (lhs, rhs) in     for (lhsCriteria, rhsCriteria) in [(lhsCrtria1, rhsCriteria1), (lhsCrtria2, rhsCriteria2), (lhsCrtria3, rhsCriteria3), ... , (lhsCrtriaN, rhsCriteriaN)] {         if lhsCriteria == rhsCriteria {             continue         }          return lhsCriteria < rhsCriteria     } }上面的代碼不是解決類似問題的唯一方式,不過關(guān)鍵思路是相似的。關(guān)鍵思路就是把多個(gè)條件打包到一個(gè)集合當(dāng)中去遍歷。
extension BlogPost {     static var examples2: [BlogPost] = [         BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2),         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3),         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2),         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1),         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2),         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10),         BlogPost(title: "Angero", pageView: 1, sessionDuration: 2)     ] }  typealias AreInIncreasingOrder = (BlogPost, BlogPost) -> Bool // <1>      let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in         let predicates: [AreInIncreasingOrder] = [ // <2>         { $0.pageView > $1.pageView },         { $0.sessionDuration > $1.sessionDuration},         { $0.title < $1.title }     ]          for predicate in predicates { // <3>         if !predicate(lhs, rhs) && !predicate(rhs, lhs) { // <4>             continue // <5>         }                  return predicate(lhs, rhs) // <5>     }          return false }<1>我聲明了一個(gè)別名 AreInIncreasingOrder 用來匹配排序閉包,這提高了我們對(duì)謂詞集合聲明的可讀性
<2> 我們聲明了一個(gè)謂詞集合
<3> 我們遍歷這個(gè)謂詞集合
<4> 這里是關(guān)鍵邏輯,我們想要檢查條件是否能決定博文順序。但是 AreInIncreasingOrder 返回了一個(gè)布爾值. 我們應(yīng)該如何判斷他們是否相等? 在回答這個(gè)問題之前,我們先檢查一下 AreInIncreasingOrder 的定義。
AreInIncreasingOrder 是一個(gè)謂詞,他會(huì)在第一個(gè)參數(shù)能決定順序時(shí)返回 true 否則返回 false 。兩個(gè)變量只有在各自都不是升序時(shí)才相等。
這意味著無論我們的參數(shù)順序如何,謂詞都必須是 false。換言之 lhs.pageView < rhs.pageView 和 rhs.pageView < lhs.pageView必須等于false才能決定順序相等。這就是我們 !predicate(lhs, rhs) && !predicate(rhs, lhs) 這句代碼的意思。
<5> 如果順序相等,那么 continue 到下一個(gè)謂詞。
<6> 如果順序不相等,那么我們可以用這個(gè)謂詞來排序。
排序結(jié)果:
[BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0), BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2.0), BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0), BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0), BlogPost(title: "Angero", pageView: 1, sessionDuration: 2.0), BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0), BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)]
到此,關(guān)于“Swift 中怎么進(jìn)行多重條件排序”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
                網(wǎng)站欄目:Swift中怎么進(jìn)行多重條件排序
                
                瀏覽地址:http://www.chinadenli.net/article16/igpgdg.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、App設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)