2017-01-05 2 views
1
class Flight{ 
    var name:String? 
    var vocabulary:Vocabulary? 
} 


class Vocabulary{ 
    var seatMapPlan:[Plan] = [] 
    var foodPlan:[Plan] = [] 
} 

class Plan{ 
    var planName:String? 
    var planId:String? 
} 


var flightList:[Flight] = [] 
var plan1 = Plan() 
plan1.planId = "planId1" 
plan1.planName = "Planname1" 

var plan2 = Plan() 
plan2.planId = "planId2" 
plan2.planName = "Planname2" 

var plan3 = Plan() 
plan3.planId = "planId3" 
plan3.planName = "Planname3" 

var plan4 = Plan() 
plan4.planId = "planId4" 
plan4.planName = "Planname4" 

var plan5 = Plan() 
plan5.planId = "planId5" 
plan5.planName = "Planname5" 

var plan6 = Plan() 
plan6.planId = "planId6" 
plan6.planName = "Planname6" 

var flight1 = Flight() 
flight1.name = "Flight1" 
flight1.vocabulary = Vocabulary() 
flight1.vocabulary?.seatMapPlan = [plan1, plan2] 
flight1.vocabulary?.foodPlan = [plan3, plan4, plan5] 


var flight2 = Flight() 
flight2.name = "Flight2" 
flight2.vocabulary = Vocabulary() 
flight2.vocabulary?.seatMapPlan = [plan2, plan3] 
flight2.vocabulary?.foodPlan = [plan3, plan4, plan5] 

flightList=[flight1, flight2] 

問題1。この特定の例については、iOS-迅速、3-入れ子のソートや組合flatmapと、マップ、フィルタまたはformUnion

seatMapUnion = [plan1,plan2,plan3] 

私はこれを達成することができません。 この特定の問題を解決するために、フィルター、フラットマップ、マップの組み合わせを教えてください。

問題2: 私は、この配列フライトリストを計画(プラン1または複数)に基づいてソートしなければならないという逆のシナリオもあります。フィルターとマップに基づいてこれを並べ替えたいが、入れ子では実現が困難になっている。例: 1: 検索パラメータがseatMapPlanのplan1である場合。結果はflight1です。

2: また、検索パラメータがseatMapPlanのplan2である場合。結果はflight1、flight2です。

+0

自分で好きなことを行い、パラメータを持つinitメソッドを追加します。 – gnasher729

+0

実際の環境でGnasher729はjson構文解析されており、ネストされています。これは単に質問するためのものです。 –

答えて

1

最初の問題については、私はセットを使用します。だから、最初のPlanHashableを実装します:そして、それは簡単です

class Plan : Hashable { 
    var planName:String? 
    var planId:String? 

    public var hashValue: Int { return planName?.hashValue ?? 0 } 
    public static func ==(lhs: Plan, rhs: Plan) -> Bool { return lhs.planId == rhs.planId } 
} 

let set1 = Set<Plan>(flight1.vocabulary!.seatMapPlan) 
let set2 = Set<Plan>(flight2.vocabulary!.seatMapPlan) 

let union = set1.union(set2) 
print(union.map { $0.planName! }) 

それは印刷します:

["Planname2", "Planname1", "Planname3"] 

ない私はあなたの第二の問題を理解しておくが。

+0

var planArray = flightlList.flatMap {$ 0.vocabulary!.seatMapPlan} ; var unionArray = Array(Set(planArray)) –

関連する問題