Tôi đã tìm kiếm một cách thanh lịch và hiệu quả để phân đoạn một chuỗi thành các chuỗi con có độ dài nhất định trong Ruby.
Cho đến nay, điều tốt nhất tôi có thể nghĩ ra là:
def chunk(string, size)
(0..(string.length-1)/size).map{|i|string[i*size,size]}
end
>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []
Bạn có thể muốn chunk("", n)
quay lại [""]
thay vì []
. Nếu vậy, chỉ cần thêm dòng này làm dòng đầu tiên của phương thức:
return [""] if string.empty?
Bạn có đề xuất giải pháp nào tốt hơn không?
Biên tập
Cảm ơn Jeremy Ruten về giải pháp thanh lịch và hiệu quả này: [sửa: KHÔNG hiệu quả!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Biên tập
Giải pháp string.scan mất khoảng 60 giây để cắt 512k thành 1k khối 10000 lần, so với giải pháp dựa trên lát cắt ban đầu chỉ mất 2,4 giây.