说我有一个Arraylist
fun main() { var myarrayList= ArrayList<String>() myarrayList.add("+23") myarrayList.add("-25") myarrayList.add("+125") myarrayList.add("+455") myarrayList.add("") myarrayList.add("*230") myarrayList.add("-293") myarrayList.add("/6") myarrayList.add("") myarrayList.add("+293") myarrayList.add("") myarrayList.add("+21") for (index in 0..myarrayList.size-1){ print (index) print (" = ") print (myarrayList.get(index)) print ("\n") } }
我想在值=“”的每个索引处将其拆分为较小的Arraylist。我知道我可以使用indexOf()和lastIndexOf对其进行切片,但是我只能得到2个切片。我需要分成多个数组
答案 0 :(得分:0)
您绝对可以在此处使用arrayList的.sublist函数:
fun subList(fromIndex: Int, toIndex: Int): MutableList<E>
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/sub-list.html
答案 1 :(得分:0)
您可以使用集合功能的组合来解决您的问题。 首先,您应该找到带有空字符串(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map-indexed-not-null.html)的索引:
val splitPoints =
myarrayList.mapIndexedNotNull() { idx, str -> if (str.isEmpty()) idx else null }
接下来,您可以使用windowed
从列表中连续获取两个项目。要获得列表的第一部分和最后一部分,您需要添加-1和ArrayList
的大小。现在,您可以使用sublist
并提取各个部分:
val splittedList =
(listOf(-1) + splitPoints + myarrayList.size)
.windowed(2, 1)
.map { (start, end) -> myarrayList.subList(start + 1, end) }
答案 2 :(得分:0)
我对Kotlin / Anko还是陌生的,并且意识到您的回答涉及RXKotlin。我从没听说过开窗,但抬头一看。它的更多学习。但是,我可以使用以下代码实现相同的目的。感谢大家的帮助
有趣的main(){
var myarrayList= ArrayList<String>()
var emptyIndexes= ArrayList<Int>()
emptyIndexes.add(0)
myarrayList.add("+23")
myarrayList.add("-25")
myarrayList.add("+125")
myarrayList.add("+455")
myarrayList.add("")
myarrayList.add("*230")
myarrayList.add("-293")
myarrayList.add("")
myarrayList.add("+293")
myarrayList.add("")
myarrayList.add("+21")
for (index in 0..myarrayList.size-1){
print (index)
print (" = ")
print (myarrayList.get(index))
print ("\n")
///find empty index
if (myarrayList.get(index)==""){
emptyIndexes.add(index)
}
}
emptyIndexes.add(myarrayList.size)
print("\n")
for (item in emptyIndexes){
print ("empty index "+ item +" ")
}
for (index in 0..emptyIndexes.size-1){
//println ("start index " +index)
if (index==emptyIndexes.size-1){break}
//println ("end index "+ (index+1) )
// print("\n\nemptyIndixes size)"+ emptyIndexes.size +"\n\n")
var subCals=myarrayList.subList(emptyIndexes[index],emptyIndexes[(index+1)])
//println (subCals )
var stToCal=""
for (items in subCals){
stToCal=stToCal+items.toString()
}
}
}
答案 3 :(得分:0)
我无法想象没有简单的方法可以做到这一点……实际上有很多方法可以解决它,但是所有方法都有一个或另一个“缺陷”(例如,您需要添加一些“缺陷”)索引在最前面或最后面...否则您需要注意不要丢失最后一个条目,因为没有最后的""
等)。如果您一开始就不需要列表列表,那么它就很简单:
myarrayList.joinToString("") {
if (it == "") "\n" else it
}
基本上只返回一个String
,如下所示:
+23-25+125+455
*230-293/6
+293
+21
也许这会给您一个提示,joinToString
...现在仍然可以使用joinToString
,但只是将其相应地拆分(显然是一种解决方法),还有什么可能的事情:
myarrayList.joinToString("|") {
if (it == "") "FORM_END" else it
}.splitToSequence("|FORM_END|") // use split if List<*> is ok for you
.map {
it.splitToSequence("|") // use split if *<List<String>> is ok for you
}
现在,这基本上将为您提供一系列序列。添加.map { it.toList() }.forEach(::println)
将得到以下结果:
[+23, -25, +125, +455]
[*230, -293, /6]
[+293]
[+21]
另一种方法,没有joinToString
-解决方法,而是将mapIndexedNotNull
与zipWithNext
一起使用,其打印效果与以前相同:
myarrayList.mapIndexedNotNull { i, s -> i.takeIf { s == "" } }
.let {
listOf(-1) + it + myarrayList.size // ugly, but we need beginning and end too, not only the delimiting indices
}
.asSequence()
.zipWithNext { from, upto -> myarrayList.subList(from + 1, upto) }
.forEach(::println)
您也可以使用fold
来构建某些东西...但是请确保同时也收集列表的最后一个条目;-)
答案 4 :(得分:0)
我在搜索相同的东西,最终为List
创建了自己的扩展函数。
fun <E> List<E>.split(separator: E): List<List<E>> =
mutableListOf<List<E>>().also { result ->
var end = -1
var remaining = this
while (end < remaining.size) {
remaining = remaining.drop(end + 1)
end = remaining.indexOf(separator).let {
if (it == -1) remaining.size else it
}
result.add(remaining.subList(0, end))
}
}