Java连接2个哈希映射,包括重复键

Java连接2个哈希映射,包括重复键,java,Java,我试图找到一种方法,将2个txt文件读入我的java类(将它们放入哈希映射),然后将它们连接到一个哈希映射(我将后者写入txt文件) 大概是这样的: 我希望txt3包含txt1和txt2中的所有单词 txt1 word1 -> [a] [b] [c] word2 -> [r] txt2 word1 -> [z] [d] word3 -> [k] txt3-我想要创建的内容 word1 -> [a] [b] [c] [z] [d] word2 -> [r]

我试图找到一种方法,将2个txt文件读入我的java类(将它们放入哈希映射),然后将它们连接到一个哈希映射(我将后者写入txt文件) 大概是这样的: 我希望txt3包含txt1和txt2中的所有单词

txt1

word1 -> [a] [b] [c]
word2 -> [r]
txt2

word1 -> [z] [d] 
word3 -> [k]
txt3-我想要创建的内容

word1 -> [a] [b] [c] [z] [d]
word2 -> [r]
word3 -> [k]
在我的代码中

字行[0]=字1

字行[1]=->

字行[2]=[a][b][c]

代码

public void readPartialPosting(){
HashMap[]字典1=新的HashMap[2];
dictionary1[0]=新HashMap();
dictionary1[1]=新的HashMap();
文件来自文件;
BufferedReader br=null;
试一试{
fromFile=新文件(“1.txt”);
br=新的BufferedReader(新的文件读取器(fromFile));
字符串st;
字符串[]字行;
字符串项;
字符串定位;
而((st=br.readLine())!=null){
字线=st.split(“,3);
术语=字行[0];
termLocation=文字行[2];
字典1[0]。put(术语,术语位置);
}
fromFile=新文件(“2.txt”);
br=新的BufferedReader(新的文件读取器(fromFile));
而((st=br.readLine())!=null){
字线=st.split(“,3);
术语=字行[0];
termLocation=文字行[2];
字典1[1]。put(术语,术语位置);
}
}捕获(例外e){
}
}
因此,在代码的最后,我基本上有上面的txt1和txt2,现在我试图以某种方式创建txt3,但我不知道如何连接列表,以防我有重复的键(然后我只想将字符串一个接一个地添加在一起,而不是覆盖)

我甚至不确定我对哈希映射的想法是否是这里的正确解决方案可能是另一种结构

我在论坛上阅读时看到了计算功能,但我不确定这是否能帮助我,也不确定如何准确使用

希望我在论坛上发帖像在提示中问的那样。
谢谢你的帮助

使用Java 8功能,
dictionary1
中的两个
Map
对象可以按如下方式组合

注意:将
dictionary1
从数组更改为
List
,以消除有关泛型数组的编译器警告/错误。如果可以避免,就不应该使用泛型数组

解决方案(Java 8+)

输出

word1=[a][b][c][z][d]
word2=[r]
word3=[k]

使用Java 8功能,
字典1
中的两个
Map
对象可以按如下方式组合

注意:将
dictionary1
从数组更改为
List
,以消除有关泛型数组的编译器警告/错误。如果可以避免,就不应该使用泛型数组

解决方案(Java 8+)

输出

word1=[a][b][c][z][d]
word2=[r]
word3=[k]

首先,我建议您将创建字典从文件封装到单独的方法中:

public static Map<String, String> createFileDictionary(String path) throws IOException {
    File fromFile = new File(path);

    try (BufferedReader br = new BufferedReader(new FileReader(fromFile))) {
        Map<String, String> dictionary = new HashMap<>();
        String str;

        while ((str = br.readLine()) != null) {
            String[] parts = str.split(" ", 3);
            dictionary.put(parts[0], parts[2]);
        }

        return dictionary;
    }
}
公共静态映射createFileDictionary(字符串路径)引发IOException{
File fromFile=新文件(路径);
try(BufferedReader br=new BufferedReader(new FileReader(fromFile))){
Map dictionary=newhashmap();
字符串str;
而((str=br.readLine())!=null){
String[]parts=str.split(“,3);
dictionary.put(部分[0],部分[2]);
}
返回字典;
}
}
然后使用,您可以准备好您的文件,并将所有字典的项目放入单个映射中

// java 8 or higher
private static void putAll(Map<String, String> dest, Map<String, String> src) {
    src.forEach((key, val) -> dest.merge(key, val, (s1, s2) -> s1 + ' ' + s2));
}

// java 7 or earlier
private static void putAll(Map<String, String> dest, Map<String, String> src) {
    for (Map.Entry<String, String> entry : src.entrySet()) {
        if (dest.containsKey(entry.getKey()))
            dest.put(entry.getKey(), dest.get(entry.getKey()) + ' ' + entry.getValue());
        else
            dest.put(entry.getKey(), entry.getValue());
    }
}
//java 8或更高版本
私有静态void putAll(映射dest、映射src){
src.forEach((key,val)->dest.merge(key,val,(s1,s2)->s1+''+s2));
}
//java 7或更早版本
私有静态void putAll(映射dest、映射src){
对于(Map.Entry:src.entrySet()){
if(dest.containsKey(entry.getKey()))
dest.put(entry.getKey()、dest.get(entry.getKey())+“”+entry.getValue());
其他的
dest.put(entry.getKey(),entry.getValue());
}
}
并在客户代码中使用:

Map<String, String> fileDictionary = new HashMap<>();
putAll(fileDictionary, createFileDictionary("1.txt"));
putAll(fileDictionary, createFileDictionary("2.txt"));
Map fileDictionary=newhashmap();
putAll(fileDictionary,createFileDictionary(“1.txt”);
putAll(fileDictionary,createFileDictionary(“2.txt”);

首先,我建议您将创建字典从文件封装到单独的方法中:

public static Map<String, String> createFileDictionary(String path) throws IOException {
    File fromFile = new File(path);

    try (BufferedReader br = new BufferedReader(new FileReader(fromFile))) {
        Map<String, String> dictionary = new HashMap<>();
        String str;

        while ((str = br.readLine()) != null) {
            String[] parts = str.split(" ", 3);
            dictionary.put(parts[0], parts[2]);
        }

        return dictionary;
    }
}
公共静态映射createFileDictionary(字符串路径)引发IOException{
File fromFile=新文件(路径);
try(BufferedReader br=new BufferedReader(new FileReader(fromFile))){
Map dictionary=newhashmap();
字符串str;
而((str=br.readLine())!=null){
String[]parts=str.split(“,3);
dictionary.put(部分[0],部分[2]);
}
返回字典;
}
}
然后使用,您可以准备好您的文件,并将所有字典的项目放入单个映射中

// java 8 or higher
private static void putAll(Map<String, String> dest, Map<String, String> src) {
    src.forEach((key, val) -> dest.merge(key, val, (s1, s2) -> s1 + ' ' + s2));
}

// java 7 or earlier
private static void putAll(Map<String, String> dest, Map<String, String> src) {
    for (Map.Entry<String, String> entry : src.entrySet()) {
        if (dest.containsKey(entry.getKey()))
            dest.put(entry.getKey(), dest.get(entry.getKey()) + ' ' + entry.getValue());
        else
            dest.put(entry.getKey(), entry.getValue());
    }
}
//java 8或更高版本
私有静态void putAll(映射dest、映射src){
src.forEach((key,val)->dest.merge(key,val,(s1,s2)->s1+''+s2));
}
//java 7或更早版本
私有静态void putAll(映射dest、映射src){
对于(Map.Entry:src.entrySet()){
if(dest.containsKey(entry.getKey()))
dest.put(entry.getKey()、dest.get(entry.getKey())+“”+entry.getValue());
其他的
dest.put(entry.getKey(),entry.getValue());
}
}
并在客户代码中使用:

Map<String, String> fileDictionary = new HashMap<>();
putAll(fileDictionary, createFileDictionary("1.txt"));
putAll(fileDictionary, createFileDictionary("2.txt"));
Map fileDictionary=newhashmap();
putAll(fileDictionary,createFileDictionary(“1.txt”);
putAll(fileDictionary,createFileDictionary(“2.txt”);

您可以进一步简化它,因为地图有一个
forEach
字典1.forEach(d->d.forEach((键,值)->合并。合并(键,值,(v1,v2)->v1+“”+v2))@Aomine谢谢。忘了那个。答案已更新。:-)谢谢你的回答,我有一个问题,虽然我是新的lambda表达式。首先,我在“List.of(Map.of”(“word1”),“[a][b][c],“word2”中得到一个错误