5.7 KiB
List built-in class
Mutable list of any objects.
It's class in Lyng is List
:
[1,2,3]::class
>>> List
you can use it's class to ensure type:
[]::class == List
>>> true
Indexing
indexing is zero-based, as in C/C++/Java/Kotlin, etc.
val list = [10, 20, 30]
list[1]
>>> 20
There is a shortcut for the last:
val list = [10, 20, 30]
[list.last, list.lastIndex]
>>> [30,2]
Important negative indexes works wherever indexes are used, e.g. in insertion and removal methods too.
Concatenation
You can concatenate lists or iterable objects:
assert( [4,5] + [1,2] == [4,5,1,2])
assert( [4,5] + (1..3) == [4, 5, 1, 2, 3])
>>> void
Appending
To append to lists, use +=
with elements, lists and any Iterable instances, but beware it will
concatenate Iterable objects instead of appending them. To append Iterable instance itself, use list.add
:
var list = [1, 2]
val other = [3, 4]
// appending lists is clear:
list += other
assert( list == [1, 2, 3, 4] )
// but appending other Iterables could be confusing:
list += (10..12)
assert( list == [1, 2, 3, 4, 10, 11, 12])
// now adding list as sublist:
list.add(other)
assert( list == [1, 2, 3, 4, 10, 11, 12, [3,4]])
>>> void
Removing elements
List is mutable, so it is possible to remove its contents. To remove a single element by index use:
assertEquals( [1,2,3].removeAt(1), [1,3] )
assertEquals( [1,2,3].removeAt(0), [2,3] )
assertEquals( [1,2,3].removeLast(), [1,2] )
>>> void
There is a way to remove a range (see Range for more on ranges):
assertEquals( [1, 4], [1,2,3,4].removeRange(1..2))
assertEquals( [1, 4], [1,2,3,4].removeRange(1..<3))
>>> void
Open end ranges remove head and tail elements:
assertEquals( [3, 4, 5], [1,2,3,4,5].removeRange(..1))
assertEquals( [3, 4, 5], [1,2,3,4,5].removeRange(..<2))
assertEquals( [1, 2], [1,2,3,4,5].removeRange( (2..) ))
>>> void
Comparisons
assert( [1, 2] != [1, 3])
assert( [1, 2, 3] > [1, 2])
assert( [1, 3] > [1, 2, 3])
assert( [1, 2, 3] == [1, 2, 3])
assert( [1, 2, 3] != [1, 2, "three"])
// note that in the case above objects are referentially different:
assert( [1, 2, 3] !== [1, 2, 3])
>>> void
In-place sort
List could be sorted in place, just like [Collection] provide sorted copies, in a very like way:
val l1 = [6,3,1,9]
l1.sort()
assertEquals( [1,3,6,9], l1)
l1.sortBy { -it }
assertEquals( [1,3,6,9].reversed(), l1)
l1.sort() // 1 3 6 9
l1.sortBy { it % 4 }
// 1,3,6,9 gives, mod 4:
// 1 3 2 1
// we hope we got it also stable:
assertEquals( [1,9,6,3], l1)
>>> void
Members
name | meaning | type |
---|---|---|
size |
current size | Int |
add(elements...) |
add one or more elements to the end | Any |
insertAt(index,elements...) |
insert elements at position | Int, Any |
removeAt(index) |
remove element at position | Int |
remove(from,toNonInclusive) |
remove range from (incl) to (nonincl) | Int, Int |
remove(Range) |
remove range | Range |
removeLast() |
remove last element | |
removeLast(n) |
remove n last elements | Int |
contains(element) |
check the element is in the list (1) | |
[index] |
get or set element at index | Int |
[Range] |
get slice of the array (copy) | Range |
+= |
append element(s) (2) | List or Obj |
sort() |
in-place sort, natural order | void |
'sortBy(predicate)` | in place sort bu predicate call result (3) |
void |
`SortWith(comparator) | in place sort using comarator function (4) |
void |
- (1)
- optimized implementation that override
Array
one - (2)
+=
append either a single element, or all elements if the List or other Iterable instance is appended. If you want to append an Iterable object itself, useadd
instead.- (3)
- predicate is called on each element, and the returned values are used to sort in natural
order, e.g. is same as
list.sortWith { a,b -> predicate(a) <=> predicate(b) }
- (4)
- comparator callable takes tho arguments and must return: negative value when first is less,
positive if first is greater, and zero if they are equal. For example, the equvalent comparator
for
sort()
will be `sort { a, b -> a <=> b }
It inherits from Iterable too and thus all iterable methods are applicable to any list.
Member inherited from Array
name | meaning | type |
---|---|---|
last |
last element (throws if empty) | |
lastOrNull |
last element or null | |
lastIndex |
Int | |
indices |
range of indexes | Range |
contains(item) |
test that item is in the list |
- (1)
- end-inclisiveness allows to use negative indexes to, for exampe, remove several last elements, like
list.removeRangeInclusive(-2, -1)
will remove two last elements.