2016-09-28 11 views
5

Ruby

Ruby ma each_cons które mogą być używane jak toSwift odpowiednik "each_cons" Ruby

class Pair 
    def initialize(left, right) 
     @left = left 
     @right = right 
    end 
end 
votes = ["a", "b", "c", "d"] 
pairs = votes.each_cons(2).map { |vote| Pair.new(*vote) } 
p pairs 
# [#<Pair @left="a", @right="b">, #<Pair @left="b", @right="c">, #<Pair @left="c", @right="d">] 

Swift

tego samego kodu w szybki, ale bez funkcji each_cons

struct Pair { 
    let left: String 
    let right: String 
} 
let votes = ["a", "b", "c", "d"] 
var pairs = [Pair]() 
for i in 1..<votes.count { 
    let left = votes[i-1] 
    let right = votes[i] 
    pairs.append(Pair(left: left, right: right)) 
} 
print(pairs) 
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")] 

W jaki sposób można skrócić lub skrócić ten kod skrótu?

+0

Podobna kwestia jest tutaj: https://stackoverflow.com/q/26395766/78336 – neoneye

Odpowiedz

6
zip(votes, votes.dropFirst()) 

Powoduje utworzenie sekwencji krotek.

Przykład

struct Pair { 
    let left: String 
    let right: String 
} 
let votes = ["a", "b", "c", "d"] 
let pairs = zip(votes, votes.dropFirst()).map { 
    Pair(left: $0, right: $1) 
} 
print(pairs) 
// [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")] 
+0

bardzo eleganckie rozwiązanie. Dziękuję Kevin – neoneye

+1

Cieszę się, że ktoś o tym pomyślał. Czy możemy to uogólnić, abyśmy nie musieli sztywno kodować '2' z' each_cons (2) '? – matt

+0

Jednak Swift nie ma ogólnej wersji 'zip': działa to tylko dla par. –

2

Jest to ogólne rozwiązanie wymyśliłem, ale wydaje się, jakby strasznie niewydajne. Aby wdrożyć each_cons(n) ustaw mój clump do n:

 let arr = [1,2,3,4,5,6,7,8] 
     let clump = 2 
     let cons : [[Int]] = arr.reduce([[Int]]()) { 
      memo, cur in 
      var memo = memo 
      if memo.count == 0 { 
       return [[cur]] 
      } 
      if memo.count < arr.count - clump + 1 { 
       memo.append([]) 
      } 
      return memo.map { 
       if $0.count == clump { 
        return $0 
       } 
       var arr = $0 
       arr.append(cur) 
       return arr 
      } 
     } 
Powiązane problemy