(Đây là một biến thể để this Q&A)Scala cách tốt nhất để chuyển Bộ sưu tập thành Bản đồ theo khóa? (2 biến thể)
Nói rằng tôi có điều này:
List("foo", "bar", "spam")
Tôi muốn tạo ra một bản đồ mà chính là chiều dài của chuỗi và giá trị là Bộ sưu tập của tất cả các chuỗi có độ dài đó. Nói cách khác, được đưa ra danh sách về, chúng tôi nhận được:
Map(3 -> List(foo, bar), 4 -> List(spam))
Code tôi đã viết để làm điều này là:
list.foldLeft(Map[Long, List[String]]()) {
(m, s) => m(s.length) = s ::
(if (m.contains(s.length)) m(s.length)
else Nil)
}
này hoạt động, nhưng nó bổ sung thêm rất nhiều xấu xa để câu trả lời thanh lịch Daniel Spiewak cung cấp cho câu hỏi ban đầu (tham chiếu ở trên).
Bất kỳ ý tưởng nào về cách cải thiện giải pháp cho biến thể của tôi?
Cảm ơn! Sean
Tôi không tìm thấy biến thể cuối cùng xấu xí, nếu độ dài val được rút ngắn thành val l. Biến thư đơn trong scala thường được sử dụng trong scala trong phong cách tương tự như các công thức toán học, tức là bạn khai báo ý nghĩa của một biến giữ chỗ, và sau đó chỉ cần sử dụng nó. Bởi vì điều này dẫn đến các biểu thức rất ngắn (thường là một lớp lót), tên ngắn được coi là khó hiểu trong các ngôn ngữ khác không phải là một vấn đề trong thực tế. – Palimondo
@Palimondo Nó không phải là chiều dài làm phiền tôi. Tôi không thích phá vỡ tính toán trong hai câu lệnh. Thật không may, Scala không thể tối ưu hóa 's.length' để tái sử dụng giá trị, như Haskell sẽ làm. –