Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get next value on a map?

I'm trying to compare element to next element in a collection.

For example :

let array: [(Double, String)]= [(2.3, "ok"),
                                (1.4, "ok"),
                                (5.1, "notOk")]

I need a returned array who will summary element where the string is the same. So my result will be :

new array = [(3.7, "ok"), (5.1, "notOk")]

I need to do it functional if possible. i tried to get next element in a map but can't found how.

Something like this (this is just for logic, this code isn't working.

let newArray = array.map {(element, nextElement) in 
    if element.1 == nextElement.1 {
        return element.0 + nextElement.0 
    }
} 
like image 460
Makaille Avatar asked Dec 06 '22 15:12

Makaille


1 Answers

In a more functional way:

let array: [(Double, String)]= [(2.3, "ok"),
                                (1.4, "ok"),
                                (5.1, "notOk")]
let keys = Set(array.map{$0.1})            // find unique keys
let result = keys.map { key -> (Double, String) in   
    let sum = array.filter {$0.1 == key}   // find all entries with the current key
                   .map {$0.0}             // map them to their values
                   .reduce(0, +)           // sum the values
    return (sum, key)
}
print(result)

Output:

[(5.0999999999999996, "notOk"), (3.6999999999999997, "ok")]

Alternatively (suggested by @dfri):

let keys = Set(array.map{$0.1})            // find unique keys
let result = keys.map { key -> (Double, String) in   
    let sum = array.reduce(0) { $0 + ($1.1 == key ? $1.0 : 0) }
    return (sum, key)
}
like image 189
DrummerB Avatar answered Feb 09 '23 15:02

DrummerB