Java地图内容比较

Java地图内容比较,java,map,hashmap,comparator,treemap,Java,Map,Hashmap,Comparator,Treemap,下面是一个棘手的数据结构和数据组织案例 我有一个应用程序,可以从大文件中读取数据,并生成各种类型的对象(例如,布尔值,整数,字符串),这些对象被分类为几个(不到十几个)组,然后存储在数据库中 每个对象当前存储在单个HashMap数据结构中。每个这样的HashMap对应于一个类别(组)。每个数据库记录都是根据所有类别(HashMap数据结构)中包含的所有对象中的信息构建的 出现了检查后续记录在列的数量和类型上是否“等效”的要求,其中必须通过比较每个存储对象的名称(HashMapkey)和类型(实际

下面是一个棘手的数据结构和数据组织案例

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

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

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

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

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

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


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

一个解决方案是保持基于类别的哈希映射和组合的
树映射。这将稍微需要更多的内存,但不会太多,因为您将在这两个内存中保持相同的引用

因此,每当您添加/删除到
HashMap
时,您也将在
树映射中执行相同的操作。这样,两者将始终同步


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

一个解决方案是保持基于类别的HashMap
和组合的
TreeMap
。这将稍微需要更多的内存,但不会太多,因为您将在这两个内存中保持相同的引用

因此,每当您添加/删除到
HashMap
时,您也将在
树映射中执行相同的操作。这样,两者将始终同步


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

创建一个元排序集,在其中存储所有创建的映射

表示
SortedSet
,例如
TreeSet
,它作为一个自定义
比较器
,可以精确检查您对相同数量和名称的钥匙以及每个值的相同对象类型的要求

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

==编辑====

因为我首先误解了数据库记录和映射之间的关系,所以我必须改变一些语义,当然现在我的答案是有一点

尽管如此,我还是会使用前面提到的
SortedSet
,但当然
地图现在会指向您和havexy建议的地图

另一方面,如果使用
集合
分类集
,您的KeyAndType将只包含具有适当
可比
实现或
与hashcode
相等的键和类型,这可能是向前迈出的一步

为什么??你问如何找出两个记录之间的差异?如果每个记录都与这些内部
集合中的一个相关
,则可以轻松使用
retainal()
来形成两个连续集合的交集

如果您将其与
分类数据集的概念进行比较,那么在这两种方式中,您都将拥有比较器中字段之间的差异逻辑,一次比较内部集,一次比较内部映射。由于在构造周围的集合时,这些信息会丢失,因此如果没有另一个简化的结构,很难在以后获得两个记录之间的差异,而这个简化的结构很容易找到这些差异。由于这样一个
集合既可以作为两个记录之间比较的关键,也可以作为两个记录之间比较的简单基础,因此它可以很好地用于这两个目的

此外,如果您想将这样一个
集合
与您的记录或
映射组
保持关系,您的元结构可以是这样的:
Map
Map
由一个简单的
LinkedHashMap
实现,它允许按原始顺序进行简单迭代。

创建一个元排序集,在其中存储所有创建的映射

表示
SortedSet
,例如
TreeSet
,它作为一个自定义
比较器
,可以精确检查您对相同数量和名称的钥匙以及每个值的相同对象类型的要求

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

==编辑====

因为我首先误解了数据库记录和映射之间的关系,所以我必须改变一些语义,当然现在我的答案是有一点

尽管如此,我还是会使用前面提到的
SortedSet
,但当然
地图现在会指向您和havexy建议的地图

另一方面,如果使用
集合
分类集
,您的KeyAndType将只包含具有适当
可比
实现或
与hashcode
相等的键和类型,这可能是向前迈出的一步

为什么??你问如何找出两个记录之间的差异?如果每个记录都与这些内部
集合中的一个相关
,则可以轻松使用