我最近偶然发现SO question询问如何在SortedMap
中检索大于给定键的键。非常,这些SortedMap
方法值得注意:
from(from: A): SortedMap[A, B]
创建此集合的远程投影,没有上限
iteratorFrom(start: A): Iterator[(A, B)]
根据此映射的顺序,在此映射中包含的键大于或等于start的所有键/值对上创建迭代器。 x.iteratorFrom(y)相当于但通常比x.from(y).iterator更有效。
keysIteratorFrom(start: A): Iterator[A]
根据此集合的顺序,在此集合中包含的所有键(或元素)上创建一个大于或等于start的迭代器。 x.keysIteratorFrom(y)相当于但通常比x.from(y).keysIterator更有效。
valuesIteratorFrom(start: A): Iterator[B]
根据此映射的顺序,在此映射中包含的所有值上创建一个迭代器,该值与大于或等于start的键相关联。 x.valuesIteratorFrom(y)相当于但通常比x.from(y).valuesIterator更有效。
为了检索小于给定密钥的密钥,您可以使用这些SortedMap
方法(afaIk):
to(to: A): SortedMap[A, B]
创建此集合的范围投影,没有下限
问题:
为什么没有模拟方法iteratorTo
,keysIteratorTo
和valuesIteratorTo
?
如果它们存在,它们将如何工作?:
sortedMap.to(_).iterator()
的操作来获取这些迭代器,尽管SortedMap的实现可以提供更有效的iteratorTo
& co(类似于iteratorFrom
& co)答案 0 :(得分:1)
当开始固定在最低键时,takeWhile就足够了:
scala> val m = TreeMap((0 to 10) map (i => (i, ('a' + i).toChar)) : _*)
m: scala.collection.immutable.TreeMap[Int,Char] = Map(0 -> a, 1 -> b, 2 -> c, 3 -> d, 4 -> e, 5 -> f, 6 -> g, 7 -> h, 8 -> i, 9 -> j, 10 -> k)
scala> m.iterator.takeWhile(_._1 < 5)
res1: Iterator[(Int, Char)] = non-empty iterator
scala> .toList
res2: List[(Int, Char)] = List((0,a), (1,b), (2,c), (3,d), (4,e))