2017-08-13 7 views
6

एक स्ट्रिंग को प्रत्येक अक्षर के तारों में विभाजित करने का एक बेवकूफ तरीका क्या होगा?स्प्लिट स्ट्रिंग प्रत्येक एन अक्षरों

उदाहरण:

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

हम स्ट्रिंग लंबाई जो मैं this Java answer में की तरह एक regex इस्तेमाल कर सकते हैं 2.

एक बहु है, लेकिन मैं एक बेहतर तरीका खोजने के लिए उम्मीद थी कि यह मान सकते हैं (यानी कोटलिन के अतिरिक्त तरीकों में से एक का उपयोग करना)।

उत्तर

9

एक बार कोटलिन 1.2 जारी होने के बाद, आप फ़ंक्शन का उपयोग कर सकते हैं जो kotlin-stdlib में KEEP-11 प्रस्ताव द्वारा जोड़ा गया है। उदाहरण:

val chunked = myString.chunked(2) 

आप पहले से ही Kotlin 1.2 M2 pre-release के साथ इस कोशिश कर सकते हैं।


तब तक आप इस कोड के साथ एक ही लागू कर सकते हैं:

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] 

इस कार्यान्वयन शेष वह यह है कि कम से कम size तत्वों चला जाता है। आप इसे संशोधित भी कर सकते हैं परिणाम को शेष में जोड़ दें। generateSequence का उपयोग कर chunked की

+0

मुझे लगता है कि कार्यान्वयन के साथ एक समस्या है, मामला यदि मूल स्ट्रिंग की लंबाई भी नहीं है। –

+0

@ लियोअर-ऑन क्यों? यह सिर्फ शेष छोड़ देगा। – hotkey

+0

आप सही हैं। मुझे इस सवाल पर ध्यान नहीं आया। –

1

एक कार्यात्मक संस्करण:

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) 

आउटपुट:

"".chunked(2) => [] 
"ab".chunked(2) => [ab] 
"abcd".chunked(2) => [ab, cd] 
"abc".chunked(2) => [ab, c] 
संबंधित मुद्दे