Một trong những ưu điểm của việc không xử lý các bộ sưu tập thông qua các chỉ mục là tránh các lỗi off-by-one. Đó chắc chắn không phải là lợi thế duy nhất, nhưng nó là một trong số đó.Tắt bằng cách trượt?
Bây giờ, tôi thường sử dụng sliding
trong một số thuật toán trong Scala, nhưng tôi cảm thấy rằng nó thường dẫn đến một cái gì đó rất giống với off-by-one lỗi, bởi vì một sliding
của m
yếu tố trong một tập hợp các kích thước n
có kích thước n - m + 1
yếu tố. Hoặc, trivially hơn, list sliding 2
là một phần tử ngắn hơn list
.
Cảm giác tôi nhận được là có sự trừu tượng bị thiếu trong mẫu này, thứ gì đó sẽ là một phần sliding
, phần nào đó khác - như foldLeft
là reduceLeft
. Tôi không thể nghĩ ra cái đó có thể là gì, tuy nhiên. Bất cứ ai có thể giúp tôi tìm thấy sự giác ngộ ở đây?
CẬP NHẬT
Kể từ khi mọi người không ai rõ ràng những gì tôi đang nói, chúng ta hãy xem xét trường hợp này. Tôi muốn viết hoa một chuỗi. Về cơ bản, mọi chữ cái không có chữ cái trước phải là chữ hoa, và tất cả các chữ cái khác phải là chữ thường. Sử dụng sliding
, tôi phải viết hoa chữ cái đầu tiên hoặc chữ cái cuối cùng. Ví dụ:
def capitalize(s: String) = s(0).toUpper +: s.toSeq.sliding(2).map {
case Seq(c1, c2) if c2.isLetter => if (c1.isLetter) c2.toLower else c2.toUpper
case Seq(_, x) => x
}.mkString
Thú vị ... ví dụ cụ thể của bạn có vẻ với tôi như một máy nhà nước sẽ là thích hợp (bạn có thể làm những ngắn gọn trong scala?), và nếu bạn muốn một số chức năng của 'trượt' thì bạn cũng muốn nhìn về phía trước - điều này bắt đầu giống như một trình phân tích cú pháp. Nó cũng có nghĩa là tôi không biết đủ để trả lời câu hỏi của bạn :) (từ các bit nhỏ tôi đã đọc nó có vẻ giống như một mô hình giống như iteratee có thể giúp, vì vậy bạn có thể nhìn vào đó, nhưng tôi không có ý tưởng thực sự). – Owen
Hoặc có thể cách nói rằng bạn cần phải tạo một trường hợp đặc biệt đầu tiên vì nó * là * một trường hợp đặc biệt, có nghĩa là sẽ có một mã thông báo đại diện cho sự bắt đầu của chuỗi, giống như máy phân tích/máy phân tích trạng thái. – Owen
Tôi đồng ý với Owen: vấn đề mô tả trường hợp đặc biệt ký tự đầu tiên, do đó, mã cũng cần phải có. Đây là cách tôi đọc câu lệnh vấn đề: "Viết hoa mỗi ký tự nếu ký tự đầu tiên (a) là ký tự đầu tiên, hoặc (b) sau ký tự chữ cái". Hành vi cho ký tự đầu tiên cần được xác định cụ thể. –