2016-09-28 19 views
5

của Ruby

Ruby có each_cons có thể được sử dụng nhưSwift tương đương với "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

Các mã này cùng nhanh chóng, nhưng không có each_cons chức năng

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")] 

Mã swift này có thể được thực hiện ngắn hơn hoặc đơn giản hơn như thế nào?

+0

Một câu hỏi tương tự là ở đây: https://stackoverflow.com/q/26395766/78336 – neoneye

Trả lời

6
zip(votes, votes.dropFirst()) 

Điều này tạo ra một chuỗi các bộ dữ liệu.

Ví dụ

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

giải pháp rất thanh lịch. Cảm ơn bạn Kevin – neoneye

+1

Tôi rất vui vì ai đó đã đưa ra một số suy nghĩ này. Chúng ta có thể khái quát hóa điều này để chúng ta không phải mã hóa cứng '2' của' each_cons (2) 'không? – matt

+0

Tuy nhiên, Swift không có phiên bản chung của 'zip': điều này chỉ hoạt động đối với các cặp. –

2

Đây là giải pháp chung tôi đã đưa ra, nhưng có vẻ như loại khủng khiếp không hiệu quả. Để thực hiện each_cons(n), thiết clump để n tôi:

 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 
      } 
     } 
Các vấn đề liên quan