2017-01-05 3 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] 

Problem 1: ich verwenden möchte flatmap, Filter, kundenspezifische einzigartige func oder Sets.formUnion eine Vereinigung von seatMapPlans zu erreichen. Für dieses spezielle Beispiel ist esiOS- rasche 3- Nested Sortierung und Vereinigung mit flatmap, Karte, Filter oder formUnion

seatMapUnion = [plan1,plan2,plan3] 

Aufgrund der Verschachtelung mit Hilfe der beantworteten Fragen kann ich dies nicht erreichen. Bitte geben Sie mir eine Kombination aus Filter, FlatMap und Map zur Lösung dieses speziellen Problems.

Problem 2: Ich habe auch umgekehrt Szenarien, wo ich dieses Array flightList auf der Grundlage des Plans (Plan1 oder mehrere) ausgewählt haben. Ich möchte dies auf der Grundlage von Filter und Karte sortieren, aber die Verschachtelung macht es schwierig zu erreichen. z.B. 1: Wenn der Suchparameter Plan1 für seatMapPlan ist. Dann ist das Ergebnis flight1.

z.B. 2: Und wenn der Suchparameter Plan2 für seatMapPlan ist. Dann ist das Ergebnis flight1, flight2.

+0

Tun Sie sich einen Gefallen und fügen Sie init Methoden mit Parametern hinzu. – gnasher729

+0

Gnasher729 in der tatsächlichen Umgebung sind sie json analysiert und hoch verschachtelt. Dies ist nur zum Stellen einer Frage. –

Antwort

1

Für das erste Problem würde ich Sätze verwenden. Also zuerst machen PlanHashable implementieren:

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

Dann ist es einfach:

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

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

Es drucken werden:

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

nicht sicher, ob ich Ihr zweites Problem verstehen.

+0

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