问题描述
val x = TreeSet<Int>(compareBy { it.toString() })
x.add(2);
x.add(4)
x.add(5)
x.add(15)
x.add(1)
x.add(34)
println(x)
print(x.filter { it in 5..19 })
我有一些类似于上面示例代码中提到的用例。我有一堆数据(大小可能非常大)考虑一个时间序列,我需要从列表中过滤掉 2 个日期之间的那些项目?有比 O(n) 方法更好的解决方案吗?
解决方法
这里的问题是您的 TreeSet
的排序顺序与范围不同,因此我们不能只在 TreeSet
中找到范围边界并取其间的所有内容。
如果 TreeSet
按自然顺序排序 (val x = TreeSet<Int>()
),您可以这样做:
val subset = x.subSet(5,true,19,true)
这个操作几乎是免费的 (O(1)),你只需支付 (O(log(N))) 来迭代这个 TreeSet
(迭代器构造将需要两次查找子集边界)。
之后,你可以用嘲笑的方式对它进行排序:
println(subset.toSortedSet(compareBy { it.toString() }))