Pertanyaan Apa cara terbaik untuk memotong string ke dalam potongan panjang tertentu di Ruby?


Saya telah mencari cara yang elegan dan efisien untuk memotong string menjadi substring dari panjang yang diberikan di Ruby.

Sejauh ini, hal terbaik yang bisa saya temukan adalah:

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)
=> []

Anda mungkin menginginkannya chunk("", n) mengembalikan [""] dari pada []. Jika demikian, tambahkan saja ini sebagai baris pertama dari metode:

return [""] if string.empty?

Apakah Anda merekomendasikan solusi yang lebih baik?

Edit

Terima kasih kepada Jeremy Ruten untuk solusi elegan dan efisien ini:

def chunk(string, size)
    string.scan(/.{1,#{size}}/)
end

76
2018-04-16 01:06


asal


Jawaban:


Menggunakan String#scan:

>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/)
=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]

137
2018-04-16 01:26



Inilah cara lain untuk melakukannya:

"abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s }

=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]


16
2018-02-04 20:04



Saya pikir ini adalah solusi yang paling efisien jika Anda tahu string Anda adalah kelipatan ukuran bongkahan

def chunk(string, size)
    (string.length / size).times.collect { |i| string[i * size, size] }
end

dan untuk bagian

def parts(string, count)
    size = string.length / count
    count.times.collect { |i| string[i * size, size] }
end

2
2017-07-26 14:00



test.split(/(...)/).reject {|v| v.empty?}

Penolakan itu diperlukan karena sebaliknya termasuk ruang kosong di antara set. Regex-fu saya tidak cukup untuk melihat bagaimana cara memperbaikinya dari atas kepala saya.


1
2018-04-16 01:20



Adakah batasan lain yang ada dalam pikiran Anda? Kalau tidak, saya akan tergoda untuk melakukan sesuatu yang sederhana seperti itu

[0..10].each {
   str[(i*w),w]
}

0
2018-04-16 01:15