2013-05-08 38 views
10

Tôi hiện đang thử những thứ trong Scala, cố gắng làm quen với lập trình hàm cũng như nghiêng lại một ngôn ngữ mới (đã lâu rồi).Sáp nhập một danh sách các chuỗi bằng cách sử dụng mkString vs foldRight

Bây giờ, hãy đưa ra một danh sách các chuỗi nếu tôi muốn kết hợp chúng thành một chuỗi dài (ví dụ: "scala", "is", "fun" => "scalaisfun") Tôi đã tìm ra một cách để thực hiện nó là thực hiện foldRight và áp dụng nối trên các phần tử tương ứng. Một cách khác, thừa nhận đơn giản hơn nhiều, là gọi mkString.

Tôi đã kiểm tra trên github nhưng không thể tìm thấy mã nguồn cho các chức năng tương ứng (bất kỳ trợ giúp nào sẽ được đánh giá cao), vì vậy tôi không chắc chắn về cách thực hiện các chức năng. Từ đỉnh đầu của tôi, tôi nghĩ rằng mkString linh hoạt hơn nhưng cảm thấy rằng có thể có foldRight trong quá trình triển khai ở đâu đó. Có sự thật nào không?

Nếu không, scaladocs đề cập đến các yêu cầu mkString trên toString cho từng yếu tố tương ứng. Thấy rằng họ đã bắt đầu với chuỗi, đó có thể là một điểm tiêu cực cho mkString trong trường hợp cụ thể này. Bất kỳ ý kiến ​​về ưu và khuyết điểm của cả hai phương pháp, đối với hiệu suất, đơn giản/sang trọng, vv?

+0

Đây là nguồn của mkString nếu bạn quan tâm. https://www.assembla.com/code/scala-eclipse-toolchain/git/nodes/src/library/scala/collection/TraversableOnce.scala?rev=9752caefeb97123f195b32b4166577e59bf22bce#ln262 – sberry

Trả lời

17

Câu trả lời đơn giản: sử dụng mkString.

someString.toStringreturns cùng một đối tượng.

mkString được triển khai với một StringBuilder và chỉ tạo 1 chuỗi mới. Với foldLeft bạn sẽ tạo ra N-1 chuỗi mới.

Bạn có thể sử dụng StringBuilder trong foldLeft, nó sẽ được nhanh như mkString, nhưng mkString ngắn:

strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString 
strings.mkString // same result, at least the same speed 
+1

Tốc độ tương tự không hoàn toàn chính xác trong ví dụ về foldLeft, sử dụng StringBuilder không có dung lượng ban đầu có thể kết thúc tạo nhiều hơn một chuỗi tùy thuộc vào đầu vào, không chắc chắn nếu mkstring lặp trước để xác định dung lượng StringBuilder đúng, nhưng nếu đó là trường hợp thì chúng không phải là tốc độ tương tự nếu không thì có không đảm bảo rằng hoặc sẽ chỉ tạo 1 chuỗi mới. –

2

Bộ nhớ Im phục vụ, mkString sử dụng StringBuilder để tạo Chuỗi có hiệu quả. Bạn có thể thực hiện điều tương tự bằng cách sử dụng Scala StringBuilder làm bộ tích lũy để foldRight, nhưng tại sao lại bận tâm nếu mkString có thể làm tất cả những thứ tốt cho bạn. Thêm mkString mang lại cho bạn lợi ích bổ sung cũng bao gồm dấu tách tùy chọn. Bạn có thể làm điều đó trong foldRight nhưng nó đã được thực hiện cho bạn với mkString

5

Không sử dụng foldRight trừ khi bạn thực sự cần nó, vì nó sẽ tràn ngăn xếp của bạn cho lớn bộ sưu tập (đối với một số loại bộ sưu tập). foldLeft hoặc fold sẽ hoạt động (không lưu trữ dữ liệu trung gian trên ngăn xếp), nhưng sẽ chậm hơn và khó xử hơn mkString. Nếu danh sách không phải là rỗng, reducereduceLeft cũng sẽ hoạt động.

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