Java 从n个列表合并哈希映射
我会尽可能地描述我的问题,但请询问是否有不合理的地方Java 从n个列表合并哈希映射,java,list,merge,hashmap,Java,List,Merge,Hashmap,我会尽可能地描述我的问题,但请询问是否有不合理的地方 我有有限数量的清单 每个列表包含有限数量的联系人 每个联系人都表示为HashMap 每个列表都链接到一个提供者 同一联系人可能存在于多个提供商中(因此也存在多个列表) 我需要一个包含其他列表中所有唯一条目的“主”列表 我正在寻找一种有效的方法将这些列表合并到一个主列表中,而不需要重复。例如,如果同一联系人出现在多个列表中(多个HashMaps对应于同一个物理人),我希望将所有HashMaps合并到一个列表中,并将合并的HashMap放入主
- 我有有限数量的清单
- 每个列表包含有限数量的联系人
- 每个联系人都表示为HashMap
- 每个列表都链接到一个提供者
- 同一联系人可能存在于多个提供商中(因此也存在多个列表)
- 我需要一个包含其他列表中所有唯一条目的“主”列表
地图。尽管如此,我还是不知道你所说的提供者是什么意思。也许你可以提供更多的细节
class Contact {
enum ContactMethod {
email,
phone,
address
}
String name;
Map<ContactMethod,Set<String>> contactInfo;
Contact(String name) {
this.name = name;
this.contactInfo = new HashMap<ContactMethod,Set<String>>();
}
void consume(Map<ContactMethod,String> info) {
for(ContactMethod method : info.keySet()) {
Set<String> modes = contactInfo.get(method);
if(modes == null) {
modes = new HashSet<String>();
contactInfo.put(method,modes);
}
modes.add(info.get(method));
}
}
}
class联系人{
枚举方法{
电子邮件,
电话,
地址
}
字符串名;
地图联络信息;
联系人(字符串名称){
this.name=名称;
this.contactInfo=newhashmap();
}
无效消费(地图信息){
for(ContactMethod方法:info.keySet()){
设置模式=contactInfo.get(方法);
如果(模式==null){
modes=新的HashSet();
contactInfo.put(方法、模式);
}
modes.add(info.get(method));
}
}
}
使用下面的类制作一个映射。尽管如此,我还是不知道你所说的提供者是什么意思。也许你可以提供更多的细节
class Contact {
enum ContactMethod {
email,
phone,
address
}
String name;
Map<ContactMethod,Set<String>> contactInfo;
Contact(String name) {
this.name = name;
this.contactInfo = new HashMap<ContactMethod,Set<String>>();
}
void consume(Map<ContactMethod,String> info) {
for(ContactMethod method : info.keySet()) {
Set<String> modes = contactInfo.get(method);
if(modes == null) {
modes = new HashSet<String>();
contactInfo.put(method,modes);
}
modes.add(info.get(method));
}
}
}
class联系人{
枚举方法{
电子邮件,
电话,
地址
}
字符串名;
地图联络信息;
联系人(字符串名称){
this.name=名称;
this.contactInfo=newhashmap();
}
无效消费(地图信息){
for(ContactMethod方法:info.keySet()){
设置模式=contactInfo.get(方法);
如果(模式==null){
modes=新的HashSet();
contactInfo.put(方法、模式);
}
modes.add(info.get(method));
}
}
}
对于您的内部主列表,您是否可以使用一个可以定义有意义的equals()的类来封装HashMap,而不仅仅是存储直接的HashMap?如果您这样做了,您可以切换到使用对主列表具有恒定时间查找(例如HashSet)的集合实现。这将消除嵌套的迭代,您只需检查来自提供者的每个联系人一次。确定您的联系人数量是否足够大,这是一种改进,这是一种反复尝试。对于内部主列表,您是否可以使用一个可以定义有意义的equals()的类来封装HashMap,而不仅仅是存储直列HashMap?如果您这样做了,您可以切换到使用对主列表具有恒定时间查找(例如HashSet)的集合实现。这将消除嵌套的迭代,您只需检查来自提供者的每个联系人一次。判断你的联系人的数量是否足够大,这是一种改进,这是一种尝试和错误。 < P>如果你的列表被排序,请考虑如下:
创建一个“合并”迭代器,使用列表中的2个迭代器。
如果两个头相同,掷一个。否则,以两者中较小者为准。
如果一个头部来自耗尽(空)的迭代器,只需呈现另一个
现在您有了一个迭代器,它从2个迭代器生成一个唯一的排序序列
你可以按需要把这些堆成堆,为你的列表找到一个唯一的迭代器。
如果你的列表被排序,考虑这个:
创建一个“合并”迭代器,使用列表中的2个迭代器。
如果两个头相同,掷一个。否则,以两者中较小者为准。
如果一个头部来自耗尽(空)的迭代器,只需呈现另一个
现在您有了一个迭代器,它从2个迭代器生成一个唯一的排序序列
您可以根据需要将这些列表堆积起来,以便为所有列表获得唯一的迭代器。第一个观察-使用HashMap表示您的联系人
您需要设计和实现一个Contact类来表示联系人。如果没有这门课,你的任务将比它需要的困难得多
该类需要所有联系人键字段的getter,并且需要基于键字段实现equals、hashcode和Comparable。非关键字段也需要getter(和可选的setter)
这样,合并过程变成(伪代码):
各阶段的性能特征应为:
- 将N个哈希映射转换为联系人对象-
O(N)
- 创建N个联系人的列表-
O(N)
- N个联系人的排序列表-
O(NlogN)
- 合并2个排序列表-
O(M+N)
总体性能应优于O(NlogN)
,其中N是主客户对象和合并客户对象的总数 第一次观察-使用HashMap表示contac