Ellen Spertus
11/27/2023, 1:39 AMCollection
are the same, if nothing is known about the concrete type? Here are some ideas:
val c: Collection<Int> = ??
// This may do more work than necessary.
println(c.toSet().size == 1)
// This requires converting the collection to a list.
val list = c.toList()
println(list.all { it == list[0] })
ephemient
11/27/2023, 2:16 AMval set = mutableSetOf<Any?>()
for (element in list) {
set.add(element)
if (set.size > 1) break
}
set.size == 1
ephemient
11/27/2023, 2:18 AMbuildSet { list.asSequence().takeWhile { size <= 1 }.forEach(::add) }.size == 1
but it's not really clearerephemient
11/27/2023, 2:21 AMIterable
though,
val sample = c.iterator().next()
list.all { it == sample }
assuming c.isNotEmpty()
and also assuming the collection can be iterated more than once (true for Collection
, but not necessarily Sequence
for example)Ellen Spertus
11/27/2023, 2:35 AMKlitos Kyriacou
11/27/2023, 10:00 AMfun <T> Iterable<T>.allEqual(): Boolean {
val iterator = iterator()
val first = iterator.next()
while (iterator.hasNext())
if (iterator.next() != first)
return false
return true
}
ephemient
11/27/2023, 11:45 AMfun Iterable<*>.allEqual(): Boolean {
val iterator = iterator()
if (!iterator.hasNext()) {
return false
}
val first = iterator.next()
for (next in iterator) {
if (next != first) {
return false
}
}
return true
}
or
private object EmptySentinel
fun Iterable<*>.allEqual(): Boolean {
return fold(EmptySentinel) { acc, elem ->
when (acc) {
EmptySentinel, elem -> elem
else -> return false
}
} != EmptySentinel
}
Paul Woitaschek
11/28/2023, 5:51 PMMark
12/08/2023, 2:40 PMfun Iterable<*>.allEqual(): Boolean {
val firstItem = firstOrNull() ?: return true
val set = mutableSetOf<Any?>(firstItem)
return none(set::add)
}
Mark
12/08/2023, 2:43 PMMark
12/10/2023, 9:38 AMfun Iterable<*>.allEqual(): Boolean {
return none(mutableSetOf<Any?>(firstOrNull() ?: return true)::add)
}
Paul Woitaschek
12/10/2023, 9:55 AMMark
12/11/2023, 5:51 AMKlitos Kyriacou
12/11/2023, 11:12 AMnull
. firstOrNull()
returning null
doesn't mean the collection is empty.Mark
12/11/2023, 11:32 AMfun Iterable<*>.allEqual(): Boolean = none(mutableSetOf<Any?>(firstOrNull())::add)
Mark
12/11/2023, 11:38 AMfirstOrNull
should only be on non-null iterables.