我有一份记录列表,其中包含国家,城市,地区和建筑物名称信息(超过50,000条记录),其中建筑物名称对于每条记录都是唯一的。
我想搜索建筑,地区和市。但是如果我将国家/地区传递给某个方法,我希望得到一个城市列表,例如: get(String country)。或者,如果我将国家和城市传递给方法,请获取地区列表,例如get(String country,String city)。
是否有任何现有的集合/库/数据结构可以执行此类操作?我在考虑树状结构/地图。我尝试了MultiKeyMap,但它没有返回值列表,也不是线程安全的。另外,我不想使用数据库来做这件事。
提前感谢您的帮助。
答案 0 :(得分:1)
SolR可能会完成您的工作:
Solr是一种流行的,快速的开源企业搜索 来自Apache Lucene项目的平台。其主要特点包括 强大的全文搜索,点击突出显示,分面搜索,动态 集群,数据库集成,丰富文档(例如,Word,PDF) 处理和地理空间搜索。 Solr具有高度可扩展性 分布式搜索和索引复制,它支持搜索和 许多世界上最大的互联网网站的导航功能...
它应该允许您创建查询,从而允许您搜索您的记录。
您还可以通过Solrj与SolR进行互动:
Solrj是一个访问solr的java客户端。它提供了一个java接口 添加,更新和查询solr索引。
答案 1 :(得分:1)
您可以像
一样使用HashMapHashMap<country,HashMap<City,HashMap<district,HashMap<building,value>>>>
答案 2 :(得分:0)
您可以查看Apache's Commons CollectionUtils。它有一个“选择”方法,可以做你想要的。
答案 3 :(得分:0)
一种非常类型的方式可能是使用每个国家/地区的.properties文件来引用其每个自己的.properties中的一个子集的子集,这些属性再次包含一个.properties来引用引用包含建筑物的.properties文件的城市。 另一个可以是具有基本实例化的“新”类的类层次结构系统,例如带有索引的构造函数的GeographicLocation,用于加载指示Region的抽象类,或者如果未通过调用重载的两个方法中的一个来指示区域列表,则反过来自动加载城市的下一个抽象类层最重要的。
Inside GeographicLocation class ....
CountryMap cntry = (CountryMap)this();
RegionMap rgion = (RegionMap)cntry;
CityMap cty = (CityMap)rgion;
....e.t.c.
答案 4 :(得分:0)
为什么不简单地使用三个哈希表(例如类型HashMap<String, List<Record>>
):一个由建筑物键入,一个由城市键入,一个由区域键入。当然,你将使用大约三倍的内存;但是有50,000个记录确实不是那么多。此外,查找将非常快速和简单。我建议尝试一下,看看它是如何表现的。