Я думаю, slice
на TreeSet
достаточно эффективен (и вы можете использовать его с диапазоном из одного элемента), но вы правы - странно, что нет индексированной отсортированной структуры данных. И это достаточно эффективно; почти любое отсортированное дерево может быть использовано таким образом, если отслеживается количество детей. Я думаю, что это просто упущение, которого не хватает.
Вы всегда можете использовать набор для повторяющихся элементов, если заключите их в тег, который допускает только равенство ссылок, и убедитесь, что они упорядочены:
class Tag[A](val value: A)(implicit ord: Ordering[A]) extends Ordered[Tag[A]] {
def compare(ta: Tag[A]) = {
val c = ord.compare(value,ta.value)
if (c != 0) c
else if (this eq ta) 0
else System.identityHashCode(this) compare System.identityHashCode(ta)
}
override def toString = value.toString+"'"
override def hashCode = value.hashCode
override def equals(a: Any) = a.asInstanceOf[AnyRef] eq this
}
scala> collection.immutable.TreeSet[Tag[Int]]() ++ List(1,2,3,2,1).map(i => new Tag(i))
res1: scala.collection.immutable.TreeSet[Tag[Int]] = TreeSet(1', 1', 2', 2', 3')
scala> res1.slice(2,3).head
res2: Tag[Int] = 2'
Однако это добавляет много накладных расходов для сравнительно простой задачи.