# Consider adding to stdlib: Split Iterable at specified index into two Lists

**URL:** <https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377>\
**Category:** Libraries\
**Created:** [April 11, 2018, 3:31pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377 "2018-04-11T15:31:04Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![venkatperi](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/venkatperi/32/4970_2.png) [@venkatperi](https://discuss.kotlinlang.org/u/venkatperi)\
**Post date:** [April 11, 2018, 3:31pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/1 "2018-04-11T15:31:05Z")

</div>

Consider adding to stdlib. For when you want to split a list into two, at a given index: [gist](https://gist.github.com/venkatperi/57c8a20d7a81325b50dc6b1e9d5c7de5). Iterates _once_ over the list.

```kotlin
val list = (0 until 10).toList()

list.splitAt(3).let { (left, right) -> 
  println(left) //=> [0, 1, 2]
  println(right) //=> [3, 4, 5, 6, 7, 8, 9]
}

```

---

<div class="post-metadata">

**Author:** ![Wasabi375](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/wasabi375/32/4741_2.png) [@Wasabi375](https://discuss.kotlinlang.org/u/Wasabi375)\
**Post date:** [April 11, 2018, 4:06pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/2 "2018-04-11T16:06:28Z")

</div>

First I guess you meant to split at index 4 and not 50. Otherwise your example makes no sense.

My problem with this method is, that it copies the entire list which can be very expensive depending on the size of the list. I am not sure if this is intentionally as I am not sure where exactly I would use this method. Can you give an example of where this might improve the code quality? Most examples I can think of would just use one of the 2 results in which case a function like `subList` might be more suitable (even though subList does not create a copy, which IMO is good).

---

<div class="post-metadata">

**Author:** ![venkatperi](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/venkatperi/32/4970_2.png) [@venkatperi](https://discuss.kotlinlang.org/u/venkatperi)\
**Post date:** [April 11, 2018, 4:42pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/3 "2018-04-11T16:42:47Z")

</div>

True, although it copies references (based on `List.take()`). If `partition()` had a `partitionWithIndex` version, that would work (`withIndex().partition()` returns `IndexedValues` which requires unwrapping).

Use case: batching incoming list of items (requires tracking remainders):

```kotlin
remainder = (remainder + someList)
  .splitAt(whereToSplit())
  .let { (items, remainder) ->
    doSomethingWith(items)
   remainder
  }

```

---

<div class="post-metadata">

**Author:** ![Wasabi375](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/wasabi375/32/4741_2.png) [@Wasabi375](https://discuss.kotlinlang.org/u/Wasabi375)\
**Post date:** [April 11, 2018, 4:53pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/4 "2018-04-11T16:53:37Z")

</div>

This is exactly the kind of example where copying all the references could cost a lot of speed and the usage of `subList` would be beneficiary as you do not modify the lists. Therefore the 2 split parts can be implemented as a “container” pointing to a region of the original list, which makes splitting much faster because you do not need to copy any elements. If you want to modify the 2 split parts you could still create a new list copying the elements eg. by using `ArrayList(original)`.

---

<div class="post-metadata">

**Author:** ![venkatperi](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/venkatperi/32/4970_2.png) [@venkatperi](https://discuss.kotlinlang.org/u/venkatperi)\
**Post date:** [April 11, 2018, 4:58pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/5 "2018-04-11T16:58:32Z")

</div>

That’s true for `List<T>`

---

<div class="post-metadata">

**Author:** ![Wasabi375](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/wasabi375/32/4741_2.png) [@Wasabi375](https://discuss.kotlinlang.org/u/Wasabi375)\
**Post date:** [April 11, 2018, 7:16pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/6 "2018-04-11T19:16:25Z")

</div>

I am not really sure what you mean by that. What exactly is true for `List<T>`?

---

<div class="post-metadata">

**Author:** ![venkatperi](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/venkatperi/32/4970_2.png) [@venkatperi](https://discuss.kotlinlang.org/u/venkatperi)\
**Post date:** [April 11, 2018, 7:28pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/7 "2018-04-11T19:28:34Z")

</div>

Sorry, I meant that a specialization for `List` can definitely use `subList`. The current receiver is `Iterable`

---

<div class="post-metadata">

**Author:** ![pabl0rg](https://avatars.discourse-cdn.com/v4/letter/p/e495f1/32.png) [@pabl0rg](https://discuss.kotlinlang.org/u/pabl0rg)\
**Post date:** [April 16, 2018, 6:59pm UTC](https://discuss.kotlinlang.org/t/consider-adding-to-stdlib-split-iterable-at-specified-index-into-two-lists/7377/8 "2018-04-16T18:59:04Z")

</div>

See

> **[chunked - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html)**

> <https://stackoverflow.com/questions/40699007/divide-list-into-parts>
