मेरे पास एक परिदृश्य है जहां मेरे पास टुपल्स के दो सरणी हैं।

tuple1 = [(score1, index1), (score2, index2), (score3, index3)]
tuple2 = [(date1, index1), (date2, index2), (date3, index4)]

मैं इन टुपल्स से स्कोर और तिथियां प्राप्त करना चाहता हूं और टुपल्स की एक नई सरणी बनाना चाहता हूं जैसे कि इसमें एक ही इंडेक्स वाले स्कोर और तारीख शामिल हैं:

tuple3 = [(score1, date1), (score2, date2)]

मैं इसे कैसे कार्यान्वित कर सकता हूं? इस परिदृश्य में पालन करने के लिए सबसे अच्छा अभ्यास क्या है? नोट: सरणियाँ विभिन्न आकारों की हो सकती हैं

परिदृश्य के लिए मेरा कार्यान्वयन इस प्रकार है:

var tuple3 = [(Double, Date)]()
    for (i,psa) in tuple1.enumerated() {

        let date = tuple2.filter({ $0.1 == i })

        if date.count == 1 {
            let newTuple = (tuple1.0, date[0].0)
            tuple3.append(newTuple)
        }
    }

क्या यह करने का यह सही तरीका है या कोई बेहतर तरीका है?

0
Naveen George Thoppan 25 सितंबर 2018, 12:15

4 जवाब

सबसे बढ़िया उत्तर
let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

let t2Dict = tuple2.reduce(into: [String:String]()) { (dict, args) in
    let (date, index) = args
    dict[index] = date
}

let tuple3 = tuple1.compactMap { args -> (String, String)? in
    let (score, index) = args
    guard let date = t2Dict[index] else { return nil }
    return (score, date)
}

यह दूसरों की तरह सुंदर नहीं है, लेकिन पहले टुपल्स में से किसी एक को डिक्शनरी में संक्षिप्त करना कहीं अधिक कुशल है।

2
XmasRights 25 सितंबर 2018, 14:24

तुम कोशिश कर सकते हो

let v1 = [("1","2"),("3","4")]

let v2 = [("1A","2A"),("3A","4A")]

let res = zip(v1,v2).map { ($0.0 , $1.0) } // [("1", "1A"), ("3", "3A")]

print(res)
3
Sh_Khan 25 सितंबर 2018, 12:22

यह काम कर जाना चाहिए:

let tuple3 = tuple1.compactMap({  (scoreInTuple1, indexInTuple1) -> (String, String)? in
    if let tupleIn2 = tuple2.first(where: { (scoreInTuple2, index2InTuple2) in index2InTuple2 == indexInTuple1 }){
        return (scoreInTuple1, tupleIn2.0)
    }
    return nil
})

(String, String) को score और date1 के वास्तविक प्रकार/वर्ग में बदलना चाहिए। साथ ही, index2InTuple2 == indexInTuple1 को भी बदला जा सकता है यदि यह कस्टम प्रकार/वर्ग है जो Equatable नहीं हो सकता है।

पहले नमूना कोड के साथ:

let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

डीबग लॉग के बाद:

print("tuple3: \(tuple3)")

आउटपुट:

$> tuple3: [("score1", "date1"), ("score2", "date2")]
0
Larme 25 सितंबर 2018, 12:31

यह वह हो सकता है जिसे आप ढूंढ रहे हैं:

let tuple1 = [("score1", "index1"), ("score2", "index2"), ("score3", "index3")]
let tuple2 = [("date1", "index1"), ("date2", "index2"), ("date3", "index4")]

let filtered = tuple1.filter {tuple2.map{$0.1}.contains($0.1)}
let result = filtered.map {tuple in
    return (tuple.0, tuple2.first(where: {$0.1 == tuple.1})!.0)
}

print (result)  // [("score1", "date1"), ("score2", "date2")]

मैं सादगी के लिए स्ट्रिंग्स का उपयोग कर रहा हूं, बस सुनिश्चित करें कि आप अपने टुपल्स में इक्वेटेबल ऑब्जेक्ट्स का उपयोग कर रहे हैं।

0
ielyamani 25 सितंबर 2018, 13:15