Averages/Mode: Difference between revisions
Content added Content deleted
No edit summary |
(Add basic Swift implementation) |
||
Line 2,915: | Line 2,915: | ||
puts [mode 1 1 2 4 4]; # --> 1 4</lang> |
puts [mode 1 1 2 4 4]; # --> 1 4</lang> |
||
Note that this works for any kind of value. |
Note that this works for any kind of value. |
||
=={{header|Swift}}== |
|||
{{works with|Swift|4}} |
|||
This solution uses an extension of the Collection type to add a mode method. The only additional requirement of the Collection is that its Element conforms to Hashable. |
|||
<lang Swift> |
|||
// Extend the Collection protocol. Any type that conforms to extension where its Element type conforms to Hashable will automatically gain this method. |
|||
extension Collection where Element: Hashable { |
|||
/// Return a Mode of the function, or nil if none exist. |
|||
func mode() -> Element? { |
|||
var frequencies = [Element: Int]() |
|||
// Standard for loop. Can also use the forEach(_:) or reduce(into:) methods on self. |
|||
for element in self { |
|||
frequencies[element] = (frequencies[element] ?? 0) + 1 |
|||
} |
|||
// The max(by:) method used here to find one of the elements with the highest associated count. |
|||
if let ( mode, _ ) = frequencies.max(by: { $0.value < $1.value }) { |
|||
return mode |
|||
} else { |
|||
return nil |
|||
} |
|||
} |
|||
} |
|||
["q", "a", "a", "a", "a", "b", "b", "z", "c", "c", "c"].mode() // returns "a" |
|||
[1, 1, 2, 3, 3, 3, 3, 4, 4, 4].mode() // returns 3 |
|||
let emptyArray: [Int] = [] |
|||
emptyArray.mode() // returns nil |
|||
</lang> |
|||
=={{header|UNIX Shell}}== |
=={{header|UNIX Shell}}== |