2017-01-07 4 views
1

私は遊び場に次のコードを書いて、うまくいきますが、ちょっと混乱しているようです。これをスウィフトで書くもっと簡潔な方法はありますか? 1、12、2、12、3、12、4、13、5、13、6、13、7、14、8、14スウィフト特定の順序で2つの配列に結合する

私は文字列は次のようになりたいです私は、各アレイ内のどのように多くの値を知ることができませんと配列は、偶数倍ではないかもしれないが、私はこれがすべてをカバーする場合はわからない各配列2値

let array1 = [1,2,3,4,5,6,7,8] //sample 1st array 
let array2 = [12,13,14]   //sample 2nd array 

let relationshipInterval = 3 
let remainder = (array1.count % relationshipInterval) 
let multiples = (array1.count - remainder)/relationshipInterval 
var string = "" 
var array1Start = 0 
var array1End = relationshipInterval-1 
var array2Value = 0 

for _ in 1...multiples { 
    for array1value in array1[array1Start...array1End] { 
    string += "\(array1value), " 
    string += String(array2[array2Value])+", " 
    } 
    array1Start = array1End + 1 
    array1End = array1Start + relationshipInterval - 1 
    array2Value += 1 
} 

for array1value in array1[array1Start...array1Start+remainder-1] { 
     string += "\(array1value), " 
     string += String(array2[array2Value])+", " 
} 
print (string) //prints 1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14 
+1

あなたは[この質問はCodeReview.SEのために適切であるかどうか]検討するかもしれない(のhttp:// meta.codereview.stackexchange.com/a/5778/1168)。 – jtbandes

答えて

3

のための3つの配列1値の関係を知っているだろうユースケースはzipflatMapjoinedのように1回で実行できます。

let array1 = [1,2,3,4,5,6,7,8] 
let array2 = [12, 13, 14] 

let text = zip(array1, array2.flatMap({ [$0, $0, $0] })) 
    .flatMap({ [$0, $1] }) 
    .map({ String($0) }) 
    .joined(separator: ", ") 

// text -> "1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14" 

ここでは、各段階で何が起こっているか明確ですので、ワンライナーは4つのステップに分かれていることです:

// 1. create an array with each element in array2 is trippled: 
let trippled = array2.flatMap({ item in 
    return [item, item, item] 
}) 
// trippled -> [12, 12, 12, 13, 13, 13, 14, 14, 14] 

// 2. zip array1 with the trippled array: 
let zipped = zip(array1, trippled) 
// zipped -> Zip2Sequence(_sequence1: [1, 2, 3, 4, 5, 6, 7, 8], _sequence2: [12, 12, 12, 13, 13, 13, 14, 14, 14]) 

// 3. flatten the zipped aray 
let combined = zipped.flatMap({ leftItem, rightItem in 
    return [leftItem, rightItem] 
}) 
// combined -> [1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14] 

// 4. tranform to a string 
let text = combined.map({ item in 
    return "\(item)" 
}).joined(separator: ", ") 
// text -> "1, 12, 2, 12, 3, 12, 4, 13, 5, 13, 6, 13, 7, 14, 8, 14" 
+0

それは完璧です。私は良い方法がなければならないことを知っていた。私はフラットマップについて多くのことを知らなかったし、それが多くの場合に事をより簡潔にすることを見出している。ありがとう。 – Chris3643

+0

比率を50:1とすると、[$ 0、$ 0 ...]を50回書く方法が簡略化されていますか? – Chris3643

+1

はい! '[$ 0、$ 0、$ 0]'を達成するもう一つの方法は、配列(繰り返し:$ 0、count:3)です。 – MathewS

関連する問題