2016-03-23 12 views
0

したがって、Cループはswift 2.2で廃止され、swift 3では削除されます。配列がswift 2.2以上でnilである場合のCループの置換

私は以下のような機能を持っていた:

func levelOrder(root: TreeNode?) -> [[Int]] { 
    guard root != nil else { return [] } 

    let leftArr = levelOrder(root!.left) 
    let rightArr = levelOrder(root!.right) 
    var merged = [[Int]]() 
    merged.append([root!.val]) 
    for i in 0...max(leftArr.count, rightArr.count) 
    { 
     var current = [Int]() 
     let currentLeft: [Int]? = i < leftArr.count ? leftArr[i] : nil 
     let currentRight: [Int]? = i < rightArr.count ? rightArr[i] : nil 
     for var j = 0; j < currentLeft?.count; j++ 
     { 
      current.append(currentLeft![j]) 
     } 
     for var j = 0; j < currentRight?.count; j++ 
     { 
      current.append(currentRight![j]) 
     } 
     if current.count > 0 
     { 
      merged.append(current) 
     } 
    } 
    return merged 
} 

私はCスタイルのループを使用していますので、ループの内側のために、currentLeftがnilであれば、ループのすべてで実行されることはありません飽きないだろうということ完璧です、コードはきれいでエレガントです。

ここで問題になるのは、スイープループを使用するには、if条件を使用して配列がnilかどうかを確認する必要があります。これは迷惑です。私のような条件を導入しなくてもCループを置き換える良い解決策はありますか?

+1

Sulthanの回答がコードを改善するはずですが、直接答えは: 'currentLeft?.forEach {current.append($ 0)}'です。それが 'nil'の場合、何も起こりません。 – Eendje

+0

@Eendjeはあなたが正しいようです。 – Wingzero

答えて

3

最も簡単な解決策は、nilの代わりに空の配列を使用することです。あなたがあなた自身の内側のループを必要としないので、簡素化し、短縮しないのはなぜ

let current = currentLeft + currentRight 
+0

ええ、私は使用[]について考えています。しかし、それが無ければ、常に可能ではありません。 – Wingzero

+0

currentLeft?.forEach { current.append($ 0) }を使用してください。 – Wingzero

2

currentLeft.forEach { 
    current.append($0) 
} 

か、単に:

let currentLeft: [Int] = i < leftArr.count ? leftArr[i] : [] 
let currentRight: [Int] = i < rightArr.count ? rightArr[i] : [] 

また、あなたは、より機能的なアプローチを使用する場合があります:

for i in 0...max(leftArr.count, rightArr.count) 
{ 
    var current = [Int]() 

    if i < leftArr.count { 
     current.appendContentsOf(leftArr[i]) 
    } 
    if i < rightArr.count { 
     current.appendContentsOf(rightArr[i]) 
    } 

    if current.count > 0 
    { 
     merged.append(current) 
    } 
} 
+0

ええ私はちょうどいくつかのツリーアルゴリズムを練習しているので、Cスタイルで速く書く。私はあなたのアイデアが好きです!ありがとう! – Wingzero

関連する問題