Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从n个列表合并哈希映射_Java_List_Merge_Hashmap - Fatal编程技术网

Java 从n个列表合并哈希映射

Java 从n个列表合并哈希映射,java,list,merge,hashmap,Java,List,Merge,Hashmap,我会尽可能地描述我的问题,但请询问是否有不合理的地方 我有有限数量的清单 每个列表包含有限数量的联系人 每个联系人都表示为HashMap 每个列表都链接到一个提供者 同一联系人可能存在于多个提供商中(因此也存在多个列表) 我需要一个包含其他列表中所有唯一条目的“主”列表 我正在寻找一种有效的方法将这些列表合并到一个主列表中,而不需要重复。例如,如果同一联系人出现在多个列表中(多个HashMaps对应于同一个物理人),我希望将所有HashMaps合并到一个列表中,并将合并的HashMap放入主

我会尽可能地描述我的问题,但请询问是否有不合理的地方

  • 我有有限数量的清单
  • 每个列表包含有限数量的联系人
  • 每个联系人都表示为HashMap
  • 每个列表都链接到一个提供者
  • 同一联系人可能存在于多个提供商中(因此也存在多个列表)
  • 我需要一个包含其他列表中所有唯一条目的“主”列表
我正在寻找一种有效的方法将这些列表合并到一个主列表中,而不需要重复。例如,如果同一联系人出现在多个列表中(多个HashMaps对应于同一个物理人),我希望将所有HashMaps合并到一个列表中,并将合并的HashMap放入主列表中。这里简单的“putall”不行,因为我需要重新键入内容以有效访问它们(例如,提供商1给我键入“电子邮件”的电子邮件地址列表,提供商2给我键入“电子邮件列表”的相同信息)

合并单独的HashMaps是两个问题中比较容易的一个,因为我知道这些键,并且可以轻松地合并它们

让我挠头的问题是高效地扫描列表。。。除了线性遍历嵌套循环中的每个列表、获取下一个HashMap、检查主列表中是否已经存在该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