1

这是一个棘手的数据结构和数据组织案例。

我有一个应用程序,它从大文件中读取数据并生成各种类型的对象(例如 、Boolean、 ) Integer,这些对象String被分类为几个(不到十几个)组,然后存储在数据库中。

每个对象当前都存储在单个HashMap<String, Object>数据结构中。每个这样HashMap的对应一个单一的类别(组)。每个数据库记录都是根据所有类别中包含的所有对象中的信息(HashMap 数据结构)构建的。

出现了检查后续记录在列的数量和类型上是否“等效”的要求,其中必须通过比较HashMap每个存储对象的名称(键)和类型(实际类)来在所有映射中验证等效性。

我正在寻找一种实现此功能的有效方法,同时保持原始对象分类,因为以尽可能快的方式按类别列出对象也是一项要求。

一个想法是对键进行排序(例如,通过将每个键替换HashMap为 a TreeMap),然后遍历所有映射。另一种方法是仅复制 a 中的所有内容以TreeMap进行比较。

实现此功能的最有效方法是什么?

此外,如果您将如何寻找连续记录之间的差异(即添加的字段和删除的字段)?

4

2 回答 2

2

一种解决方案是同时保持基于类别HashMap和组合TreeMap。这将有更多的内存需求,虽然不多,因为您只需在它们中保留相同的引用。

因此,每当您添加/删除时,HashMap您也将执行相同的操作TreeMap。这样,两者将始终保持同步。

然后,您可以使用 TreeMap 进行比较,无论您是要比较对象类型还是实际内容比较。

于 2012-04-28T15:26:51.960 回答
2

创建一个元 SortedSet,在其中存储所有创建的地图。

意味着SortedSet<Map<String,Object>>例如TreeSet作为自定义的Comparator<Map<String,Object>>,它确实检查您对相同数量和名称的键以及每个值的相同对象类型的要求。

然后,您可以使用此元集结构的 contains() 方法来确定是否已经存在类似的记录。

==== 编辑 ====

因为我首先误解了数据库记录和地图之间的关系,所以我现在当然要改变一些语义我的答案。

我仍然会使用提到SortedSet<Map<String,Object>>的,但当然Map<String,Object>现在会指向你和 hasxy 建议的地图。

另一方面,使用 a Set<Set<KeyAndType>>or可能是向前迈出的一步SortedSet<Set<KeyAndType>>,您的 KeyAndType 将仅包含键和具有适当Comparable实现的类型 or equals with hashcode

为什么?您问如何找到两条记录之间的差异?如果每条记录都与其中一个相关,Set<KeyAndType>您可以轻松地使用retainAll()它们来形成两个连续集合的交集。

如果您将此与 a 的想法进行比较SortedSet<Map<String,Object>>,那么在这两种方式中,您将拥有区分比较器内的字段的逻辑,一次比较内部集,一次比较内部映射。而且由于这些信息在构建周围集合时会丢失,如果您没有另一个易于使用的简化结构来查找此类差异,那么以后将很难获得两条记录之间的差异。并且由于这样的 aSet<KeyAndType>可以作为两个记录之间比较的关键和简单的基础,因此它可能是用于这两个目的的一个很好的候选者。

Set<KeyAndType>此外,如果您想保持此类与您的记录或元结构组之间的关系,Map<String,Object>可能类似于: Map<Set<KeyAndType>,DatabaseRecord>Map<Set<KeyAndType>,GroupOfMaps>由一个简单的实现,LinkedHashMap它允许按原始顺序进行简单的迭代。

于 2012-04-28T15:30:59.200 回答