我应该将变量设置为键的地图使用什么数据结构?

时间:2016-05-13 13:30:50

标签: java data-structures

我的数据集如下所示:

Task-1, Priority1, (SkillA, SkillB)
Task-2, Priority2, (SkillA)
Task-3, Priority3, (SkillB, SkillC)

呼叫应用程序(客户端)将发送技能列表 - 比如说(SkillD,SkillA)。

查询:

  1. 首先搜索数据集中的SkillD,但找不到任何内容。
  2. 搜索SkillA。我们将找到两个条目 - Task1和Priority1,Task-2和Priority2。
  3. 确定具有最高优先级的任务(在本例中为Task-1)
  4. 从该数据集&中删除任务-1将Task-1返回给客户
  5. 设计考虑因素:

    • 当网站上线时,会有很多添加/更新/删除数据集
    • 只有很少的技能但不是静态列表(大约10个),但是对于每种技能,可以有数千个任务。因此,查找/检索必须非常快

    我已经考虑过使用binarySearch(比较器)或Map(技能,SortedSettasks(任务))的简单List,但寻找更多的想法。

    为这种数据集设计数据结构的最佳方法是什么,它允许复杂的键和与该键关联的已排序任务组。

2 个答案:

答案 0 :(得分:1)

我会考虑MongoDB。其中一行的数据对象听起来非常适合JSON格式,而不是表格中的行。原因是因为技能组列表可能会增长。在经典关系数据库中,您可以通过三种方式之一解决此问题,一直在扩展列以确保您拥有最大数量的技能组列(这非常难看),有一个单独的表,其中包含与ID匹配的技能组分组,或将技能组存储为逗号分隔的技能组列表。每一个都很糟糕。在MongoDB中,您可以拥有数组字段,并且数组中的项是可索引的。

因此,考虑到这一点,我会对MongoDB进行所有查询并让它处理所有问题。我会创建一个这样的POJO:

public class TaskPriority {

String taskId;
String priorityId;
List<String> skillIds;

}

在MongoDB中,您可以索引所有这些字段以快速搜索和查询。

如果您必须在本地缓存这些项并从Java数据结构执行这些查询,那么您可以做的是为您关心TaskPriority对象的引用实例的项创建索引。

例如,为了跟踪其TaskPriority的技能组合,可以使用以下地图:

Map<String, TaskPriority> skillSetToTaskPriority;

您可以对taskId和priorityId重复此操作。您必须管理这些索引。这通常是您的数据库的工作。

最后,您可以拥有将taskId映射到Task对象的POJO和表(或MongodDB集合),该对象包含您可能希望拥有的有关该任务的任何元数据。优先级和SkillSet也是如此。这就是4个MongoDB集合......任务,优先级,技能集和任务优先级。

答案 1 :(得分:1)

如何更改aproach? 您可以特别使用GuavaMultimap

  

每位经验丰富的Java程序员都在某个方面实现了Map<K, List<V>>Map<K, Set<V>>,并处理了该结构的尴尬。例如,Map<K, Set<V>>是表示未标记有向图的典型方式。 Guava的Multimap框架可以轻松处理从键到多个值的映射。 Multimap是将密钥与任意多个值相关联的一般方法。

有两种方法可以从概念上考虑Multimap:作为从单个键到单个值的映射的集合:

我建议您在Multimap引入的名为Views

的强大功能中使用Multimap和问题的答案 祝你好运!