Kotlin разбивает Arraylist на части в более чем одном индексе - PullRequest
0 голосов
/ 27 ноября 2018

Скажем, у меня есть 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")


} }

Я хочу разделить его на меньшие Arraylists по каждому индексу, где значение = "".Я знаю, что могу использовать indexOf () и lastIndexOf, чтобы нарезать его, но я могу получить только 2 среза.Мне нужно разбить на несколько массивов

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Я не мог себе представить, что не существует более простого способа сделать это ... и есть так много способов решить это на самом деле, но у всех есть один или другой "недостаток" (например, вам нужно добавить некоторыеИндекс перед или в конце ... или вам нужно позаботиться о том, чтобы вы не потеряли последнюю запись, так как нет окончательного "" и т. д.).Если вам не нужен список списков, это может быть просто:

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 на месте ... но тогда просто убедитесь, чтотакже собрать последнюю запись в списке; -)

0 голосов
/ 27 ноября 2018

Вы можете использовать комбинацию функций сбора для решения вашей проблемы.Сначала вы должны найти индексы с пустыми строками (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) }
0 голосов
/ 27 ноября 2018

Я довольно новичок в Kotlin / Anko и понимаю, что ваш ответ касается RXKotlin.Я никогда не слышал о окнах, но посмотрел.Это больше, чтобы учиться.Однако я смог добиться того же с помощью следующего кода.Я благодарю всех за вашу помощь

fun 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()



        }


     }

}

0 голосов
/ 27 ноября 2018

Вы можете определенно использовать функцию .sublist для arrayList здесь:

fun subList(fromIndex: Int, toIndex: Int): MutableList<E>

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/sub-list.html

...