【问题标题】:Java map content comparisonJava地图内容比较
【发布时间】:2012-04-28 15:14:02
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: java map hashmap comparator treemap


    【解决方案1】:

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

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

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

    ==== 编辑 ====

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

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

    另一方面,使用Set<Set<KeyAndType>>SortedSet<Set<KeyAndType>> 是否会向前迈出一步,其中您的KeyAndType 将仅包含具有适当Comparable 实现或equals with hashcode 的键和类型。

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

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

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

    【讨论】:

    • 所以你的意思是我应该创建一个实现 Comparator> 的自定义 TreeSet?这将对 Map 对象进行“排序”,但如何对它们的内容进行排序?
    • @PNS 第二次阅读您的描述后,我不确定我是否理解正确。您从文件中读取字符串、布尔值、整数等类型。稍后您将讨论结合记录的列。原语没有这样的,所以我认为一个记录会转化为你所说的那些地图之一,因为键=列。但也许您可以先对此发表评论以澄清它?
    • 你几乎是对的。记录是所有映射的联合,键是列名。
    【解决方案2】:

    一个解决方案是同时保留基于HashMap 和组合TreeMap 的类别。这将需要更多的内存,但不会太多,因为您只需在它们中保留相同的引用即可。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2011-04-15
      • 2023-03-24
      • 2017-01-16
      相关资源
      最近更新 更多