1

我有一个包含国家、城市、地区和建筑物名称信息的记录列表(超过 50,000 条记录),其中建筑物名称对于每条记录都是唯一的。

我想搜索建筑物、地区和城市。但是如果我将国家传递给一个方法,例如get(String country),我想得到一个城市列表。或者,如果我将国家和城市传递给方法,则获取地区列表,例如 get(String country, String city)。

是否有任何现有的集合/库/数据结构可以做这样的事情?我正在考虑一个树状结构/地图。我尝试了 MultiKeyMap,但它不返回值列表并且它不是线程安全的。另外,我不想使用数据库来执行此操作。

在此先感谢您的帮助。

4

5 回答 5

1

SolR可能会完成您所追求的工作:

Solr 是 Apache Lucene 项目中流行的、超快的开源企业搜索平台。它的主要功能包括强大的全文搜索、命中突出显示、分面搜索、动态聚类、数据库集成、富文档(例如,Word、PDF)处理和地理空间搜索。Solr 具有高度可扩展性,提供分布式搜索和索引复制,它支持许多世界上最大的互联网站点的搜索和导航功能......

它应该允许您创建查询,这反过来又允许您搜索您的记录。

您还可以通过Solrj与 SolR 交互:

Solrj 是一个访问 solr 的 java 客户端。它提供了一个 java 接口来添加、更新和查询 solr 索引。

于 2012-07-26T05:53:30.563 回答
1

您可以像这样使用 HashMap

HashMap<country,HashMap<City,HashMap<district,HashMap<building,value>>>>
于 2012-07-26T05:55:48.557 回答
0

An off-beat type of way maybe using .properties files for each country to refer to a subset of localities in their each own .properties that again contains a a .properties to refer to cities that refer to .properties file containing buildings. Another may be a class hierarchy system with a base instantiated "new" class e.g. GeographicLocation with a constructor that is fed an index to load an abstract class that indicates a Region or brings back a list of regions if not indicated by calling one of the two methods overloaded and that in turn automatically loads the next abstract class layer of city over the top of that.

Inside GeographicLocation class ....
CountryMap cntry = (CountryMap)this();
RegionMap rgion = (RegionMap)cntry;
CityMap cty = (CityMap)rgion;
....e.t.c.
于 2012-07-26T06:25:26.310 回答
0

为什么不简单地使用三个哈希表(例如类型HashMap<String, List<Record>>):一个由建筑物键控,一个由城市键控,一个由地区键控。当然,您将使用大约三倍的内存;但 50,000 条记录确实不算多。此外,查找将非常快速和简单。我建议尝试一下,看看它的表现如何。

于 2012-07-26T22:18:18.750 回答
0

你可以看看Apache 的 Commons CollectionUtils。它有一个“选择”方法可以做你想做的事。

于 2012-07-26T05:55:02.513 回答