集合中的搜索/查询 (Java)
Posted
技术标签:
【中文标题】集合中的搜索/查询 (Java)【英文标题】:Search/Queries in Collections (Java) 【发布时间】:2009-10-15 12:10:05 【问题描述】:我创建了许多地理数据对象(姓名、邮政编码、纬度、经度)。现在我想将它们放入一个集合中,以便稍后搜索不同的条目。
一切都应该发生在面向对象/内存中,因此不需要关系数据库。
这样的查询看起来像:
按名称或 plz 查找纬度和经度 在 LAT1,LAT2 和 LON1,LON2 之间查找对象对于这样一个“简单”的数据结构,什么集合是最好的?
这样的查询需要什么复杂度? 多线程可以带来好处吗?如果是,哪个集合最适合线程安全?
是否有机会在 key=>value 数据库中编写此类查询?
【问题讨论】:
【参考方案1】:您可以使用内存数据库。
这很好,因为关系数据库非常适合此类关系查询...... :-)
对于自制纯Java,您可以使用:
Map
,以名字为key
Map
,以plz为key
List<List<"object">>
第一个列表是 LAT,第二个列表是 LON。
两者都已排序,因此您可以使用二进制搜索来搜索每个值,并使用subList
有效地返回一个区间。
这相当于键的重复,但并非所有对象都重复,因为您可以在所有这些情况下重复使用相同的实例对象。
多线程是可以接受的(如果您出于其他原因需要它),但我怀疑您是否需要引入它来提高单个搜索的性能。提到的数据结构应该在不到一毫秒的时间内提供正确的答案!
线程安全 对于这些数据结构来说不是问题,因为您的用例似乎是只读的。如果在某些情况下需要修改“对象”,那么只能保护“对象”本身,而不是用于搜索的数据结构。
【讨论】:
我想用纯java解决这个问题!排序后的结构看起来不错。使用带有按纬度/经度比较器排序的扁平对象的树不是更好吗?还有超过 100.000 个条目,所以我不确定查询是否只需要不到一毫秒。 @Martin -Map
的一些实现,例如HashMap
,在查找内容方面非常高效,即使您的地图包含更多内容,它也可以在不到一毫秒的时间内轻松找到对象超过 100.000 个条目。
使用 subSet 方法的复合键和树集难道没有更好的解决方案吗?
@Martin 如果你的树是按一个方向排序的,你只能在一个方向上搜索,不能在 LAT 和 LON 区间上搜索。示例:如果按 LAT 排序(然后 LON 以获取相等的 LAT 值),当您准确搜索 LAT 10-50、LON 17 时会发生什么?搜索找到大量兼容 LAT 的结果,其中您必须检查 所有 条目才能找到少量兼容的条目! :-(
@Martin 我之前的评论假设您只想用一个树替换两个列表,并按复合标准排序。如果您正在考虑用 SortedSet 替换每个 List,那么是的,它也可以工作。但是,找到正确的值不会比在排序列表上进行二进制搜索快。此外,找到一个间隔(我认为你需要那个)将更加困难......以上是关于集合中的搜索/查询 (Java)的主要内容,如果未能解决你的问题,请参考以下文章