这是一个棘手的数据结构和数据组织案例。
我有一个应用程序可以从大文件中读取数据并生成各种类型的对象(例如 Boolean
、 Integer
、 String
),这些对象被分为几个(少于十几个)组然后存储在数据库中。
每个对象当前都存储在一个 HashMap<String, Object>
中数据结构。每一个这样HashMap
对应于单个类别(组)。每条数据库记录都是根据所有类别(HashMap 数据结构)中包含的所有对象中的信息构建的。
出现了检查后续记录在列的数量和类型上是否“等效”的要求,其中必须通过比较名称(HashMap
键)和类型(实际类)来验证所有映射的等效性每个存储的对象。
我正在寻找一种实现此功能的有效方法,同时保持原始对象分类,因为以尽可能最快的方式按类别列出对象也是一项要求。
一个想法是只对键进行排序(例如,通过将每个 HashMap
替换为 TreeMap
)然后遍历所有 map 。另一种方法是只复制 TreeMap
中的所有内容仅供比较。
实现此功能的最有效方法是什么?
此外,如果您将如何找出连续记录之间的差异(即添加的字段和删除的字段)?
最佳答案
创建一个元 SortedSet,您可以在其中存储所有创建的 map 。
表示 SortedSet<Map<String,Object>>
例如一个TreeSet
这是一个习惯Comparator<Map<String,Object>>
它确实会检查您对相同数量和名称的键以及每个值的相同对象类型的要求。
然后您可以使用此元集结构的 contains() 方法来查明是否已经存在类似的记录。
==== 编辑 ====
因为我一开始就误解了数据库记录和 map 之间的关系,所以我现在当然要稍微改变一下我的答案的语义。
我仍然会使用提到的 SortedSet<Map<String,Object>>
但当然是 Map<String,Object>
现在将指向您和 havexy 建议的那个 map 。
另一方面,使用 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
实现这允许按原始顺序进行简单迭代。
关于Java map 内容对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364795/