集合中的搜索/查询 (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)的主要内容,如果未能解决你的问题,请参考以下文章

Java中的集合框架

Java中的集合框架(上)

Java中的集合框架

Java中的集合框架

java代码中 单表查询出的list集合 怎么读写到redis中

Java递归遍历集合