2014-06-28 44 views
56

Có đối tác trong Swift tới flatten trong Scala, Xtend, Groovy, Ruby và đồng không?Làm phẳng mảng Mảng trong Swift

var aofa = [[1,2,3],[4],[5,6,7,8,9]] 
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9] 

dĩ nhiên tôi có thể sử dụng giảm cho điều đó nhưng mà kinda hút

var flattened = aofa.reduce(Int[]()){ 
    a,i in var b : Int[] = a 
    b.extend(i) 
    return b 
} 
+0

không phải là nó giống như sử dụng đối tượng thêm của mảng? –

+0

Tôi đã không nhìn vào Swift chính nó được nêu ra nhưng trong Haskell và F # nó 'concat' - vì vậy có thể nhìn một cái gì đó được đặt tên như thế này? - Tôi khá tích cực rằng điều này là có một nơi nào đó (hầu hết các lang thang. * Biết * về monads và đây là danh sách ràng buộc) – Carsten

+0

có trong haskell nó thực sự được gọi là concat. –

Trả lời

223

Swift 3,0

reduce:

let numbers = [[1,2,3],[4],[5,6,7,8,9]] 
let reduced = numbers.reduce([], +) 

flatMap:

let numbers = [[1,2,3],[4],[5,6,7,8,9]] 
let flattened = numbers.flatMap { $0 } 

joined:

let numbers = [[1,2,3],[4],[5,6,7,8,9]] 
let joined = Array(numbers.joined()) 
+17

Sẽ rất tuyệt nếu OP đánh dấu điều này là chính xác.Câu trả lời kinh điển không được coi là "nhập thư viện" khi có một lớp lót ngắn gọn hoạt động tốt (và tôi đoán hiệu quả hơn). – Charlesism

+2

Chỉ cần nêu rõ điều này, 'flatMap' có sẵn dưới dạng Swift 1.2. –

+2

sự khác nhau giữa 'tham gia' (chính thức được gọi là 'flatten') với' flatMap' là gì? Có phải là trong khi 'flatMap' tham gia, nó cũng có thể ánh xạ/biến đổi mọi thứ. nhưng ở đây trong ví dụ chúng ta thực sự không cần, tức là chúng ta trả về '$ 0' – Honey

2

Một thực hiện chung chung hơn của reduce,

let numbers = [[1,2,3],[4],[5,6,7,8,9]] 
let reduced = reduce(numbers,[],+) 

này hoàn thành điều tương tự nhưng có thể đưa ra cái nhìn sâu sắc hơn vào những gì đang xảy ra trong reduce .

Từ tài liệu của Apple,

func reduce<S : SequenceType, U>(sequence: S, initial: U, combine: (U, S.Generator.Element) -> U) -> U 

Mô tả

Return kết quả của nhiều lần kêu gọi kết hợp với một giá trị tích lũy khởi tạo ban đầu và mỗi yếu tố của chuỗi, lần lượt .

3

này đã làm việc cho tôi:

let numbers = [[1, 2, 3], [4, 5, 6]] 
let flattenNumbers = numbers.reduce([], combine: +) 
24

Từ Swift 2.0 có flatten (hoặc joined trong Swift 3) phương pháp thực hiện cho CollectionType giao thức:

let numbers = [[1,2,3],[4],[5,6,7,8,9]] 
let flattened = Array(numbers.flatten()) 

Trong một số trường hợp sử dụng flatten() có thể có lợi vì nó trả về bộ sưu tập lười thay vì mảng, nhưng luôn có thể được chuyển đổi thành một mảng khi được chuyển đến Array().

+0

@chrisco bạn có thể vui lòng giải thích về cách câu trả lời của tôi không chính xác và tiêu chí cho "câu trả lời chính xác đơn giản nhất" là gì? Bạn có thể vui lòng cho biết cách xóa câu trả lời có thể ảnh hưởng đến câu hỏi theo bất kỳ cách nào không? –

+0

Hãy thử chạy đoạn mã của bạn trước tiên - bạn nghĩ nó như thế nào? Nó thực sự làm gì? Câu hỏi ban đầu là gì? Câu trả lời của bạn có đúng không? Nếu không, nó sẽ là tốt hơn để xóa nó để cải thiện sự rõ ràng của bài đăng này. Tôi đã làm tương tự với câu trả lời không chính xác của riêng tôi. –

+0

@chrisco cảm ơn bạn rất nhiều vì đề xuất của bạn, nhưng tôi chạy đoạn trích trước khi đăng chúng ở bất kỳ đâu. Và câu trả lời của tôi là chính xác vì nó trả về chính xác các kết quả tương tự như OP được yêu cầu và sử dụng ít mã hơn cho điều đó. Tôi thừa nhận rằng câu trả lời ban đầu của tôi đã trả về bộ sưu tập lười thay vì một mảng, mặc dù không có giới hạn nào trong câu hỏi đó. Tôi vẫn không nghĩ rằng việc xóa một câu trả lời đúng sẽ cải thiện chất lượng của câu hỏi theo bất kỳ cách nào. –

Các vấn đề liên quan