精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Swift 中如何進行多重條件排序

開發 后端
本文中的方法與 Swift 沒有強關聯。你可以把它應用到任何語言上。您可以改進代碼,使其更通用,以支持所需的任何對象或屬性,我將此作為您的練習。如果你有什么有趣的發現,你可以在 Twitter 上和我分享你的結果。我很想看到你的實踐。

[[399875]]

本文轉載自微信公眾號「Swift 社區」,作者喜歡Swift的小安子。轉載本文請聯系Swift 社區公眾號。

前言

在一個條件或者單個屬性上進行排序非常簡單, Swift 本身就有相關的功能。

下面是對 int 數組進行排序的例子:

  1. let numbers = [3, 5, 6, 1, 8, 2] 
  2.          
  3. let sortedNumbers = numbers.sorted { (lhs, rhs) in 
  4.     return lhs < rhs 
  5.  
  6. // [1, 2, 3, 5, 6, 8] 

但有時我們需要根據多個條件或屬性來進行排序。為了演示這一點,我們創建一個結構體來作為示例。

這里我們有一個簡單的 BlogPost 結構體,它包含帖子標題和兩個統計數據,即瀏覽次數pageView和會話持續時間sessionDuration。

  1. struct BlogPost { 
  2.     let title: String 
  3.     let pageView: Int 
  4.     let sessionDuration: Double 

Sample 數據:

  1. extension BlogPost { 
  2.     static var examples: [BlogPost] = [ 
  3.         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3), 
  4.         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2), 
  5.         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1), 
  6.         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2), 
  7.         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10) 
  8.     ] 

如果您想查看哪些文章表現良好,可以按照瀏覽次數對它們直接進行排序。但是很多帖子都不那么流行,頁面瀏覽量也一樣。在這種情況下,需要根據另一個條件或屬性來進行進一步的排序。

我們將在本文中討論這種多屬性排序。他們有各種各樣的方法來解決這個問題。我將展示沒有任何復雜概念的最基本的方法。一旦你了解了基本原理,你就可以隨心所欲地進階了。

什么是多條件排序

多條件排序是指我們比較第一個條件的排序,只有當第一個條件相等時,我們才轉到下一個條件。我們這樣做直到找到一個不相等的條件。

偽代碼如下所示:

  1. let sortedObjects = objects.sorted { (lhs, rhs) in 
  2.     for (lhsCriteria, rhsCriteria) in [(lhsCrtria1, rhsCriteria1), (lhsCrtria2, rhsCriteria2), (lhsCrtria3, rhsCriteria3), ... , (lhsCrtriaN, rhsCriteriaN)] { // <1> 
  3.         if lhsCriteria == rhsCriteria { // <2> 
  4.             continue 
  5.         } 
  6.         return lhsCriteria < rhsCriteria // <3> 
  7.     } 

<1> 我們從最重要的一個(也就是第一個)開始,循環遍歷條件列表。

<2> 如果這個順序條件相等,我們不能根據它來決定順序,就跳到下一個條件。

<3> 如果我們可以根據條件決定兩個對象之間的順序,我們就停止并返回結果。

如果你很難理解偽代碼,不用擔心。我不是一個偽代碼專業作家。下面的例子應該更清楚一點。

按照兩個字段對object數組進行排序

我們使用前面提到的場景,我們希望根據表現對BlogPost進行排序。

我們的表現取決于頁面瀏覽次數pageView,如果瀏覽次數相同,我們再看sessionDuration。

下面是上一個例子中用到的BlogPost結構體和對應的sample數據。

  1. struct BlogPost { 
  2.     let title: String 
  3.     let pageView: Int 
  4.     let sessionDuration: Double 
  5.  
  6. extension BlogPost { 
  7.     static var examples: [BlogPost] = [ 
  8.         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3), 
  9.         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2), 
  10.         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1), 
  11.         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2), 
  12.         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10) 
  13.     ] 

我們衡量表現的方法可以翻譯成下面這樣的代碼:

  1. let popularPosts = BlogPost.examples.sorted { (lhs, rhs) in if lhs.pageView == rhs.pageView { // <1> return lhs.sessionDuration > rhs.sessionDuration } 
  2.  
  3.   return lhs.pageView > rhs.pageView // <2> 

<1>如果博客文章有相同的訪問次數,我們使用訪問時間。

<2>如果訪問次數不相等,我們可以直接根據訪問次數來排序(我們使用降序)

排序的結果:

  1. [BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0),  
  2. BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0),  
  3. BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0),  
  4. BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0),  
  5. BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)] 

按照多個字段對object數組進行排序

不難發現,根據兩個條件來排序非常簡單。讓我們引入更多的條件。如果博客文章的表現相同,我們按照title排序。

添加更多的sample數據:

  1. extension BlogPost { 
  2.     static var examples2: [BlogPost] = [ 
  3.         BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2), 
  4.         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3), 
  5.         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2), 
  6.         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1), 
  7.         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2), 
  8.         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10), 
  9.         BlogPost(title: "Angero", pageView: 1, sessionDuration: 2) 
  10.     ] 

兩個條件和三個條件沒什么區別,我們可以沿用相同的邏輯:

  1. let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in 
  2.     if lhs.pageView == rhs.pageView { 
  3.         if lhs.sessionDuration == rhs.sessionDuration { // <1> 
  4.             return lhs.title < rhs.title 
  5.         } 
  6.          
  7.         return lhs.sessionDuration > rhs.sessionDuration 
  8.     } 
  9.      
  10.     return lhs.pageView > rhs.pageView 

<1> 我們添加了另一個if來檢查博客文章是否具有相同的會話持續時間,如果它們具有相同的頁面瀏覽次數和會話持續時間,則按標題對它們進行排序。

排序結果:

  1. [BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0), 
  2. BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2.0), 
  3. BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0), 
  4. BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0), 
  5. BlogPost(title: "Angero", pageView: 1, sessionDuration: 2.0), 
  6. BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0), 
  7. BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)] 

問題

我們可以對兩個和三個條件使用相同的邏輯。這里唯一的問題是,條件越多,需要的嵌套就越多。

這是一個多條件的例子,可能會導致pyramid of doom。

  1. let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in 
  2.     if lhs.pageView == rhs.pageView { 
  3.         if lhs.sessionDuration == rhs.sessionDuration {  
  4.             if lhs.nextCriteria == rhs.nextCriteria {  
  5.                 if lhs.nextCriteria == rhs.nextCriteria {  
  6.                     .... 
  7.                 } 
  8.  
  9.                 ... 
  10.             } 
  11.  
  12.             ... 
  13.         } 
  14.          
  15.         return lhs.sessionDuration > rhs.sessionDuration 
  16.     } 
  17.      
  18.     return lhs.pageView > rhs.pageView 

按照N個字段對object數組進行排序

為了避免 pyramid of doom, 我們再看看之前的偽代碼:

  1. let sortedObjects = objects.sorted { (lhs, rhs) in 
  2.     for (lhsCriteria, rhsCriteria) in [(lhsCrtria1, rhsCriteria1), (lhsCrtria2, rhsCriteria2), (lhsCrtria3, rhsCriteria3), ... , (lhsCrtriaN, rhsCriteriaN)] { 
  3.         if lhsCriteria == rhsCriteria { 
  4.             continue 
  5.         } 
  6.  
  7.         return lhsCriteria < rhsCriteria 
  8.     } 

上面的代碼不是解決類似問題的唯一方式,不過關鍵思路是相似的。關鍵思路就是把多個條件打包到一個集合當中去遍歷。

  1. extension BlogPost { 
  2.     static var examples2: [BlogPost] = [ 
  3.         BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2), 
  4.         BlogPost(title: "Alice", pageView: 1, sessionDuration: 3), 
  5.         BlogPost(title: "Peter", pageView: 1, sessionDuration: 2), 
  6.         BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1), 
  7.         BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2), 
  8.         BlogPost(title: "Abena", pageView: 4, sessionDuration: 10), 
  9.         BlogPost(title: "Angero", pageView: 1, sessionDuration: 2) 
  10.     ] 
  11.  
  12. typealias AreInIncreasingOrder = (BlogPost, BlogPost) -> Bool // <1> 
  13.      
  14. let popularPosts = BlogPost.examples2.sorted { (lhs, rhs) in     
  15.     let predicates: [AreInIncreasingOrder] = [ // <2> 
  16.         { $0.pageView > $1.pageView }, 
  17.         { $0.sessionDuration > $1.sessionDuration}, 
  18.         { $0.title < $1.title } 
  19.     ] 
  20.      
  21.     for predicate in predicates { // <3> 
  22.         if !predicate(lhs, rhs) && !predicate(rhs, lhs) { // <4> 
  23.             continue // <5> 
  24.         } 
  25.          
  26.         return predicate(lhs, rhs) // <5> 
  27.     } 
  28.      
  29.     return false 

<1>我聲明了一個別名 AreInIncreasingOrder 用來匹配排序閉包,這提高了我們對謂詞集合聲明的可讀性

<2> 我們聲明了一個謂詞集合

<3> 我們遍歷這個謂詞集合

<4> 這里是關鍵邏輯,我們想要檢查條件是否能決定博文順序。但是 AreInIncreasingOrder 返回了一個布爾值. 我們應該如何判斷他們是否相等? 在回答這個問題之前,我們先檢查一下 AreInIncreasingOrder 的定義。

AreInIncreasingOrder 是一個謂詞,他會在第一個參數能決定順序時返回 true 否則返回 false 。兩個變量只有在各自都不是升序時才相等。

這意味著無論我們的參數順序如何,謂詞都必須是 false。換言之 lhs.pageView < rhs.pageView 和 rhs.pageView < lhs.pageView必須等于false才能決定順序相等。這就是我們 !predicate(lhs, rhs) && !predicate(rhs, lhs) 這句代碼的意思。

<5> 如果順序相等,那么 continue 到下一個謂詞。

<6> 如果順序不相等,那么我們可以用這個謂詞來排序。

排序結果:

  1. [BlogPost(title: "Akosua", pageView: 5, sessionDuration: 2.0),  
  2. BlogPost(title: "Zoo", pageView: 5, sessionDuration: 2.0),  
  3. BlogPost(title: "Abena", pageView: 4, sessionDuration: 10.0),  
  4. BlogPost(title: "Alice", pageView: 1, sessionDuration: 3.0),  
  5. BlogPost(title: "Angero", pageView: 1, sessionDuration: 2.0),  
  6. BlogPost(title: "Peter", pageView: 1, sessionDuration: 2.0), 
  7. BlogPost(title: "Kofi", pageView: 1, sessionDuration: 1.0)] 

結語

最近,我遇到了這個問題,覺得很有趣。這是一項簡單的任務,不過需要我花些時間去掌握。

 

本文中的方法與 Swift 沒有強關聯。你可以把它應用到任何語言上。您可以改進代碼,使其更通用,以支持所需的任何對象或屬性,我將此作為您的練習。如果你有什么有趣的發現,你可以在 Twitter 上和我分享你的結果。我很想看到你的實踐。

 

責任編輯:武曉燕 來源: Swift 社區
相關推薦

2010-02-01 18:20:17

Python 多重繼承

2011-08-22 12:05:50

Linux

2013-02-21 10:32:29

Win Server 災難恢復虛擬機

2023-12-11 08:25:15

Java框架Android

2020-04-06 14:50:43

MySQLSQL數據庫

2023-03-24 16:18:08

微服務架構

2010-09-13 10:45:04

2010-07-21 14:17:07

Linux telne

2010-02-03 13:55:51

Python 代碼

2010-07-22 10:58:49

batch Telne

2011-07-28 14:07:30

2010-06-02 14:16:18

SVN版本控制

2023-09-03 23:49:35

2013-01-28 10:11:24

敏捷設計敏捷開發

2010-02-22 16:05:40

Python配置

2021-08-26 10:05:31

APP安全加密網絡攻擊

2010-02-01 10:21:36

Python編碼轉換

2013-10-17 23:12:12

Windows 8.1Windows 8.1

2010-06-03 11:01:32

Hadoop安裝部署

2010-09-17 15:36:24

點贊
收藏

51CTO技術棧公眾號

性色av一区二区怡红| av视屏在线播放| 国产精品无码在线| 在线视频自拍| 美女一区二区在线观看| 国产精品欧美久久久久无广告 | 国产日韩av在线播放| 老子影院午夜伦不卡大全| 自拍偷拍福利视频| 伊人成综合网伊人222| 亚洲线精品一区二区三区| 91精品国产综合久久久久久久久 | 欧美色欧美亚洲高清在线视频| 91视频免费网站| 欧美精品日韩在线| 欧美性理论片在线观看片免费| 成人99免费视频| 久久久久九九九九| 少妇欧美激情一区二区三区| 日日夜夜精品一区| 久久99这里只有精品| 中文字幕无线精品亚洲乱码一区 | 国产一级做a爰片久久毛片男| 国产精品熟女久久久久久| 欧美高清在线| 欧美人妇做爰xxxⅹ性高电影| 日韩jizzz| 免费一级a毛片| 成人一区而且| 欧美男人的天堂一二区| 欧美日韩一级在线| www.久久久久久| 国产精品magnet| 日韩免费电影一区| 亚洲理论电影在线观看| 日本中文字幕电影在线免费观看 | 亚洲午夜久久久久久久国产| 亚洲成av在线| 精品久久久久久亚洲精品| 国产一区二区三区色淫影院| 日韩在线观看第一页| 亚洲性视频大全| 精品乱人伦一区二区三区| 欧美日韩精品在线一区二区 | 亚洲欧美在线免费| 免费裸体美女网站| 婷婷五月在线视频| 欧美高清在线精品一区| 91视频国产精品| 一本色道久久综合熟妇| 亚洲综合五月| 日韩成人在线视频网站| 国产视频一区二区视频| 亚洲国产欧美日本视频| 国产午夜精品久久久久久久 | 在线免费观看日韩视频| 日本在线不卡视频| 久久福利视频网| 少妇激情一区二区三区视频| 91tv亚洲精品香蕉国产一区| 亚洲乱码国产乱码精品精的特点| 国外成人在线视频网站| 天堂网在线播放| 美女网站色91| 久久久免费高清电视剧观看| 国产一级久久久久毛片精品| 久久不见久久见国语| 日韩一级免费一区| 国产理论在线播放| 国产欧洲在线| 亚洲美女视频一区| 奇米777四色影视在线看| 国产小视频在线| 毛片一区二区| 欧美国产日本在线| 91狠狠综合久久久久久| 国偷自产av一区二区三区| 欧美日韩在线免费视频| 国产一区二区三区精彩视频| jizz性欧美10| 亚洲国产精品二十页| 在线观看成人av电影| 视频国产在线观看| 国产激情91久久精品导航| 国产成人精品综合久久久| 久久网免费视频| 91欧美国产| 欧美日韩国产91| 麻豆一区在线观看| 精品久久视频| 精品视频久久久久久久| 亚洲天堂av网站| 日韩一区网站| 91精品久久久久久蜜臀| 手机在线看福利| 久久影院一区二区三区| 88在线观看91蜜桃国自产| 麻豆短视频在线观看| 国产一区二区三区免费在线 | 中文字幕乱码在线观看| 午夜一级在线看亚洲| 国产精品揄拍一区二区| 精人妻无码一区二区三区| 国内成人自拍视频| 成人疯狂猛交xxx| 影音先锋黄色网址| 成人av在线资源网| 欧美 另类 交| 日韩国产网站| 亚洲精品美女在线观看播放| 麻豆网址在线观看| 欧美伊人影院| 久久成人18免费网站| 手机在线免费看毛片| 国产精品成人a在线观看| 日韩中文字幕网址| 成人欧美一区二区三区黑人一 | 天堂成人在线观看| 亚洲色图欧美在线| 超碰10000| 性欧美videoshd高清| 亚洲黄色av一区| 黄色激情在线视频| 农村妇女一区二区| 91精品国产一区二区三区 | 日韩和一区二区| 亚洲精品在线二区| 777午夜精品福利在线观看| 亚洲精品www久久久久久| 国产在线播放一区| 99国产在线观看| 人妻少妇精品无码专区| 97久久超碰精品国产| 美女精品国产| av大全在线免费看| 日韩欧美精品免费在线| 制服丝袜第一页在线观看| 国精品一区二区三区| 538国产精品视频一区二区| 亚洲天堂五月天| 精品一区二区三区免费毛片爱 | 欧美理论在线观看| 国产片一区二区| 亚洲精品日韩在线观看| 成人毛片av在线| 欧美精品自拍偷拍| 人人澡人人澡人人看| 黄色日韩精品| 成人黄色短视频在线观看| av在线电影免费观看| 亚洲免费观看在线观看| 在线看免费毛片| 国产欧美三级电影| 久久青草福利网站| 日本黄色大片视频| 黑人欧美xxxx| 4438x全国最大成人| 一区二区三区毛片免费| 91青青草免费观看| 北条麻妃在线| 欧美日韩精品电影| 91 在线视频| 国产99久久久国产精品潘金网站| 欧美另类网站| 国产天堂在线播放视频| 欧美色网站导航| 在线观看黄网址| 高清日韩电视剧大全免费| av在线观看地址| 亚洲电影男人天堂| 国产精品女主播| 免费av网站在线播放| 精品福利视频导航| 韩国女同性做爰三级| 悠悠资源网久久精品| 国产一区视频在线| 91高清在线观看视频| 欧洲av在线精品| 懂色av粉嫩av蜜乳av| 亚洲欧美伊人| 精品欧美国产| 久久一卡二卡| 91精品国产麻豆国产自产在线| 久草网站在线观看| 老司机精品视频一区二区三区| 美国av一区二区三区| 国产一区二区三区影视| 欧美成人性生活| 色视频免费在线观看| 亚洲国产wwwccc36天堂| 1314成人网| 亚洲国产日韩欧美在线| 国产精品亚洲一区二区三区| 午夜av在线免费观看| 亚洲精品网址在线观看| 一区二区日韩在线观看| 国产欧美日韩麻豆91| 国产一级二级av| 日韩精品1区2区3区| 欧美日韩高清在线一区| 香蕉久久一区| 日韩午夜在线视频| 欧美一级淫片aaaaaa| 欧美午夜片在线看| 三年中国中文观看免费播放| 国产成人午夜99999| 免费裸体美女网站| 狠狠综合久久av一区二区老牛| 日本一区免费观看| 成人性生交大片免费网站| 日韩精品在线免费| 国产色综合视频| 亚洲免费资源在线播放| 中文字幕在线看高清电影| 久久久久综合| 人人妻人人澡人人爽欧美一区双| 成人中文视频| 欧美日本韩国国产| 国内精品偷拍| 成人免费视频网站| av在线小说| 亚洲精品视频二区| www.中文字幕| 91精品久久久久久久91蜜桃| 波多野结衣在线观看视频| 午夜电影网一区| 亚洲一区二区三区蜜桃| 成人美女视频在线观看18| 国产深夜男女无套内射| 综合五月婷婷| 在线播放 亚洲| 日韩中文在线电影| 国产激情一区二区三区在线观看| 日韩成人在线一区| 国产精品电影网| 3d玉蒲团在线观看| 久久精品国产精品亚洲| 全国男人的天堂网| 精品久久久久久久久久久久包黑料| 在线观看黄色网| 欧美色综合影院| 做爰视频毛片视频| 欧美日精品一区视频| 成人黄色激情视频| 欧美揉bbbbb揉bbbbb| 亚洲天堂手机版| 欧美日韩国产三级| 一级黄在线观看| 8x8x8国产精品| 国产av一区二区三区| 欧美性极品xxxx娇小| 人人干人人干人人干| 欧美日韩中文字幕在线视频| 日韩毛片一区二区三区| 亚洲天天做日日做天天谢日日欢| www.xx日本| 亚洲免费av高清| 精品99在线观看| 欧美激情中文不卡| 国产亚洲精品精品精品| 国产精品成人免费精品自在线观看| 亚洲美女高潮久久久| 粉嫩aⅴ一区二区三区四区 | 一个人看的www日本高清视频| 欧美日韩精品一区二区三区| 国产伦理一区二区| 精品国产一区二区三区四区四 | 91麻豆精品久久毛片一级| 亚洲蜜桃精久久久久久久| 日本系列第一页| 91福利社在线观看| 日本一二三区视频| 色综合久久88色综合天天| 麻豆成人在线视频| 黄网站色欧美视频| 最好看的日本字幕mv视频大全| 9191精品国产综合久久久久久| 99久久久无码国产精品免费| 精品人伦一区二区色婷婷| 日本一区视频| 日韩午夜在线视频| 99爱在线视频| 国产精品一区二区电影| 91精品久久久久久综合五月天| 国产精品免费久久久久久| 国产成人免费av一区二区午夜 | 日本中文字幕一区二区有码在线| 一本大道亚洲视频| 蜜桃视频在线观看网站| 色天天综合狠狠色| 第一福利在线| 久久69精品久久久久久久电影好| 亚洲电影观看| 91在线高清免费观看| 丝袜美腿一区二区三区动态图| 国产欧美亚洲日本| 成人在线免费观看91| 欧美黄网在线观看| 日韩精品1区2区3区| 老司机午夜免费福利| 国产精品色一区二区三区| www.天天色| 69久久夜色精品国产69蝌蚪网| 天天综合天天色| 欧美日韩高清区| 日韩福利影视| 欧美一区二区三区四区五区六区| 成久久久网站| 2022亚洲天堂| 高清国产午夜精品久久久久久| 免费观看特级毛片| 91久久奴性调教| 五月婷中文字幕| 亚洲精品中文字幕女同| 91高清在线观看视频| 国产精品三级网站| 亚洲自拍电影| 欧美啪啪免费视频| 国产成人av一区二区三区在线观看| 天堂av网手机版| 色综合久久中文综合久久牛| 亚洲精品综合网| 亚洲精品美女免费| 狂野欧美性猛交xxxxx视频| 91精品国产自产在线| 日韩免费av| 免费看污黄网站| 久久久国产综合精品女国产盗摄| 一级特黄曰皮片视频| 午夜精品久久久久久久99樱桃| 国产视频www| 久久精品人人爽| 四虎影视国产精品| 在线播放豆国产99亚洲| 久久精品久久精品| 欧美性生给视频| 欧美日韩国产综合一区二区| 国产精品一二三区视频| 日本一本a高清免费不卡| 亚洲免费一区| 国产自产精品| 亚洲三级色网| a级一a一级在线观看| 香港成人在线视频| 手机看片福利在线| 97成人精品区在线播放| 天堂俺去俺来也www久久婷婷| 波多野结衣家庭教师在线播放| 欧美aaa在线| 五月婷婷欧美激情| 精品视频1区2区| 免费av网站在线看| 欧美亚洲视频一区二区| 欧美人妖视频| 亚洲精品中文字幕乱码三区不卡| 日韩精品91亚洲二区在线观看| 国产视频三区四区| 欧美日韩国产成人在线91| 黄网站app在线观看| 日本精品视频在线观看| 精品日产免费二区日产免费二区 | 国产精品456露脸| 国产污视频在线看| 欧美日韩一区 二区 三区 久久精品| 成人在线免费看| 18成人免费观看网站下载| 国户精品久久久久久久久久久不卡| 国产精品手机在线观看| 欧美视频在线观看 亚洲欧| 国产高清视频在线| 成人精品一区二区三区| 黄色综合网站| 欧美多人猛交狂配| 精品视频一区二区不卡| 欧美精品videosex| 鲁丝一区二区三区免费| 麻豆精品视频在线观看| 国产亚洲精品久久久久久无几年桃| 亚洲精品久久久久久久久久久久| 福利视频在线| 国产麻豆一区二区三区在线观看| 婷婷久久一区| 亚洲中文字幕无码一区| 欧美又粗又大又爽| 女囚岛在线观看| 青青草原成人| 国产成人精品www牛牛影视| 国产成人综合欧美精品久久| 色多多国产成人永久免费网站| 91精品国产自产在线丝袜啪| 久久精品视频91| 亚洲午夜在线视频| 北条麻妃在线| 精品欧美一区二区在线观看视频| 久久精品国内一区二区三区| 日韩欧美a级片| 久久国产一区二区三区| 亚州av一区| 一区二区在线免费观看视频| 在线观看日产精品|