2017-08-13 32 views
6

Điều gì sẽ là một cách thành ngữ để chia chuỗi thành chuỗi gồm 2 ký tự?Tách chuỗi mỗi n ký tự

Ví dụ:

"" -> [""] 
"ab" -> ["ab"] 
"abcd" -> ["ab", "cd"] 

Chúng ta có thể giả định rằng chuỗi có chiều dài là bội số của 2.

tôi có thể sử dụng một regex như trong this Java answer nhưng tôi đã hy vọng để tìm thấy một cách tốt hơn (tức là sử dụng một trong các phương pháp bổ sung của kotlin).

Trả lời

9

Khi Kotlin 1.2 được phát hành, bạn có thể sử dụng chức năng chunked được thêm vào kotlin-stdlib theo đề xuất KEEP-11. Ví dụ:

val chunked = myString.chunked(2) 

Bạn đã có thể dùng thử này với Kotlin 1.2 M2 pre-release.


Cho đến lúc đó, bạn có thể thực hiện tương tự với mã này:

fun String.chunked(size: Int): List<String> { 
    val nChunks = length/size 
    return (0 until nChunks).map { substring(it * size, (it + 1) * size) } 
} 

println("abcdef".chunked(2)) // [ab, cd, ef] 

thi này giảm thời gian còn lại đó là ít hơn size yếu tố. Bạn có thể sửa đổi nó thêm phần còn lại vào kết quả.

+0

Tôi nghĩ có một vấn đề với việc thực hiện, nếu trường hợp độ dài chuỗi ban đầu không là số chẵn. –

+0

@ LiorBar-On Tại sao? Nó sẽ chỉ thả phần còn lại. – hotkey

+0

bạn nói đúng. Tôi đã bỏ lỡ ghi chú về câu hỏi. –

1

Một phiên bản chức năng của chunked sử dụng generateSequence:

fun String.split(n: Int) = Pair(this.drop(n), this.take(n)) 
fun String.chunked(n: Int): Sequence<String> = 
     generateSequence(this.split(n), { 
      when { 
       it.first.isEmpty() -> null 
       else -> it.first.split(n) 
      } 
     }) 
       .map(Pair<*, String>::second) 

Output:

"".chunked(2) => [] 
"ab".chunked(2) => [ab] 
"abcd".chunked(2) => [ab, cd] 
"abc".chunked(2) => [ab, c] 
Các vấn đề liên quan