【问题标题】:Which data structure to choose?选择哪种数据结构?
【发布时间】:2012-05-15 06:09:18
【问题描述】:

需要选择最佳数据结构以快速处理位置和区域列表。

位置(城市)有简单的 POJO:

public class Location {

    private String name;
    private int post; //id

对于地区(区):

public class Region {
    private String name;
    private int id;
    private List<Location> cities;

最后我有 ListRegion 对象。 我需要做什么:

  1. 按帖子 (id) 搜索位置名称
  2. 按名称搜索位置帖子。 注意:名称不是唯一的,所以如果名称相同,我需要选择一些具体的位置而不是另一个位置

问题是我应该使用什么数据结构? 我正在考虑包含来自所有地区的所有位置的 TreeMap。所以我可以通过名称(字符串)快速获取位置。 对于 p 1。我有解决方案:位置的帖子包含区域的 id。因此,如果 Region 的 id=1,则其 Locations 帖子将为 10001、10002 等。 或者也许我需要选择一些由 Guava 引入的新 Collections 类型,因为它已经存在于项目中?

【问题讨论】:

  • 你不应该通过 id 链接实体,你应该通过引用直接链接它们,这就是它们的用途。
  • @svick 我需要在这里使用 id 来处理客户端,它只发送和接收 id

标签: java data-structures guava


【解决方案1】:

将所有位置添加到两个HashMaps:

  1. 一个以位置名称为键,位置列表为值的所有位置。
  2. 其他以 id 为键、Location 为值的?

最好将两个哈希图隐藏在一个类中为您进行查找。

还是我错过了什么?

【讨论】:

  • 好点,但还有两个问题:如何定义“首选”位置(对于名称相同的情况)。也许将priority 字段添加到位置。第二:如何漂亮地同步原始List的变化与这两个地图?
  • 那么一个位置是否优于另一个位置?我为每个名称建议了一个位置列表(列表作为地图中的值)。因此,如果有的话,按首选顺序将它们添加到列表中,然后选择第一个(那么您可能根本不需要列表)。或者,您可以向他们展示所有附加信息,例如地区。第二点取决于面向对象,将其全部隐藏在一个类后面,只在一个地方更新,那个地方也会更新地图等等。
【解决方案2】:

我建议你创建类LocationRepository

class LocationRepository {
    Location getById(int id);
    Collection<Location> getByName(String id);
}

此存储库应包含 2 个集合:映射(位置的 HashMap 或 TreeMap:Map&lt;Integer, Location&gt;,其中键是位置 ID。第二个映射应该是来自 Guava 的 [MulitMap][1],它在名称和匹配位置集合之间进行映射。

【讨论】:

  • 选择什么 MultiMap 实现?
  • @vacuum 实现取决于您的应用程序要求。您可以找到许多 Multimap 实现。 HashMultimap 是一种选择,请注意您应该覆盖 key 类的 hashcode 和 equals 方法。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2021-04-07
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多