2015-03-02 76 views
0

我正在閱讀由蘋果提供的swift書,並且想知道如何找出在下面的代碼中哪個數字是最大的......我已經發現什麼是最大的數字現在我需要「添加另一個變量來跟蹤哪種數字最大,以及最大數量是多少。」Swift編程 - 字典迭代

let interestingNumbers = [ 
     "Prime": [2,3,5,7,11,13], 
     "Fibonacci": [1,1,2,3,5,8], 
     "Square": [1,4,9,16,25] 
] 
var largest = 0 
for (kinds, numbers) in interestingNumbers { 
     for number in numbers { 
      if number > largest { 
       largest = number 
      } 
     } 
    } 
    largest 

回答

1

像這樣:

let interestingNumbers = [ 
    "Prime": [2,3,5,7,11,13], 
    "Fibonacci": [1,1,2,3,5,8], 
    "Square": [1,4,9,16,25] 
] 
var largest = 0 
var kind = "" 
for (kinds, numbers) in interestingNumbers { 
    for number in numbers { 
    if number > largest { 
     largest = number 
     kind = kinds 
    } 
    } 
} 

另外也請注意:如果最大的數字出現一次以上(如果你的例子擴展到144這是一個斐波那契數以及12 ** 2)你只會告訴其中一個是最大的。儘管這兩個類別都有最高的數字。想想一種將結果作爲數組返回的方法。 :-)

let interestingNumbers = [ 
    "Prime": [2,3,5,7,11,13], 
    "Fibonacci": [1,1,2,3,5,8,13,21,34,55,89,144], 
    "Square": [1,4,9,16,25,36,49,64,81,100,121,144] 
] 
+0

謝謝!這不是僅僅爲我所知的一堂課。我很欣賞它 – 2015-03-02 07:12:14

+0

我想你可能已經想出了一點點努力;-) – 2015-03-02 07:13:54

+0

嘿嘿真的再次感謝! – 2015-03-02 07:14:54

1

如果你想要一個功能的實現,它可能看起來像:

let interestingNumbers = [ 
    "Prime": [2,3,5,7,11,13], 
    "Fibonacci": [1,1,2,3,5,8], 
    "Square": [1,4,9,16,25] 
] 

let result = map(interestingNumbers) { ($0, maxElement($1)) } 
    .sorted { $0.1 < $1.1 }.last 
  • map得到由序列名稱的元組的排列和最大元素按順序;

  • sorted顯然根據元組中的第二個元素排序這些結果;和

  • last抓取最後一個,即具有最大最大數的序列。

或者,你可以使用reduce找到元組的最大價值作爲其第二個項目:

let maxElements = map(interestingNumbers) { ($0, maxElement($1)) } 
let result = maxElements.reduce(maxElements.first!) { $0.1 > $1.1 ? $0 : $1 } 
+0

不錯的解決方案。但是應該注意,如果數組很長並且直接搜索只運行一次,sort可能會變慢。但從「密集」的角度來看,這是無與倫比的:-) – 2015-03-03 11:24:24

+0

是的,這就是爲什麼我添加了'減少'的方法,這是O(n),但即使這不是有效的直接方法。 – Rob 2015-03-03 11:49:15