Kotlin将Arraylist分成多个索引

时间:2018-11-27 01:49:32

标签: arraylist kotlin split slice

说我有一个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个切片。我需要分成多个数组

5 个答案:

答案 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-解决方法,而是将mapIndexedNotNullzipWithNext一起使用,其打印效果与以前相同:

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))
        }
    }