如何在Java中处理HashMaps中的重复键?

如何在Java中处理HashMaps中的重复键?,java,hashmap,Java,Hashmap,我有一个HashMap。我写了一个读取文件并打印它们的方法,但我只是认为HashMap不允许文件中存在重复的键,所以我需要做一些事情,例如保存同一个键,但最后使用某种字符(比如只是u或类似的东西,以便它们彼此不同)。我想不出解决方案(也许我可以捕捉到只写一个if块的异常)。你能帮帮我吗 public static HashMap<String, String> hashmapReader(File test3) { HashMap<String, String>

我有一个HashMap。我写了一个读取文件并打印它们的方法,但我只是认为HashMap不允许文件中存在重复的键,所以我需要做一些事情,例如保存同一个键,但最后使用某种字符(比如只是u或类似的东西,以便它们彼此不同)。我想不出解决方案(也许我可以捕捉到只写一个if块的异常)。你能帮帮我吗

public static HashMap<String, String> hashmapReader(File test3) {
    HashMap<String, String> data = new HashMap<>(); 
    try (BufferedReader hmReader = new BufferedReader(new FileReader(test3))) {
        String line;
        while ((line = hmReader.readLine()) != null) {
            String[] columns = line.split("\t");
            String key = columns[0];
            String value = columns[1];
            data.put(key, value); 
        }
    } catch (Exception e) {
        System.out.println("Something went wrong"); 
    }
    return data;
}
publicstatichashMaphashMapReader(文件test3){
HashMap数据=新的HashMap();
try(BufferedReader hmReader=newbufferedreader(newfilereader(test3))){
弦线;
而((line=hmReader.readLine())!=null){
String[]columns=line.split(“\t”);
字符串键=列[0];
字符串值=列[1];
数据输入(键、值);
}
}捕获(例外e){
System.out.println(“出错”);
}
返回数据;
}

要实现您的实际要求:


在您的
行之前放置

while (data.containsKey(key)) key += "_";
data.put(key, value);
这将继续检查映射,查看
键是否已经存在,如果已经存在,则将
\uuu
添加到末尾,然后重试

您可以一次完成这两行:

while (data.putIfAbsent(key, value) != null) key += "_";
这基本上是一样的,但它只是避免了在找不到键的情况下需要查找两次(因此应该插入值)


然而,考虑一下这是否是最好的方法:如果你在阅读时基本上是把钥匙编好的话,那么你怎么用“KEY”来查东西呢? 通过使用存储多个值的值类型,可以为每个键保留多个值,例如
列表

HashMap data=newhashmap();
// ...
data.computeIfAbsent(key,k->newArrayList()).add(value);

如果HashMap
数据中已经存在控件,则可以在该键上添加控件。
为了做到这一点,您可以使用
get(key)
方法,若键不存在,该方法将返回null:

if(data.get(key) != null)
         key = key + "_";
data.put(key, value); //adding the split line array to the ArrayList
如果它已经存在(没有返回null),那么您可以通过在末尾添加一个字符来更改他的名字,例如,如您所说的
“quot

编辑:我上面的答案向我指出了一个事实:“如果有两个以上相同的键怎么办?”。
因此,我建议您遵循他的解决方案,而不是我的解决方案。

当发生密钥冲突时,您需要什么行为?从您的语句和代码来看,您的目标并不明确。为什么要在制表符上拆分一行,或者希望它只有一个制表符并拆分为两部分,或者尝试捕获该行上的所有拆分标记。你的钥匙应该是什么?它必须是唯一的,并且应该表示一个唯一的标识符,该标识符允许您稍后在地图中搜索密钥。如果这不是您的意图,那么您可能使用了错误的数据结构
@pczeus我有一个包含两列的文件,比如“东京日本\n柏林德国…等等”,我需要将它们保存为键值结构,所以HashMap很方便。我只是在想,如果“东京”键出现多次而不是一次,那么在这种情况下我该怎么办?我不能肯定我能找到答案……你可能没有错,因为你可能想要一个键值结构,但除非你遇到实际问题,我不相信你在这里得到的任何答案都是完整的,因为你自己的要求是不完整的。非常感谢,它成功了!是的,我实际上最初是用
HashMap
structure编写代码的,但任务是用structure编写代码这个例子唯一的问题是如果同一个键有3个值-如果该键已经存在,您每次都会删除arraylist,并且只设置在ArrayList@pczeus不因为
computeIfAbsent
只会在没有新的ArrayList的情况下添加一个新的ArrayList。非常感谢!我来试试
if(data.get(key) != null)
         key = key + "_";
data.put(key, value); //adding the split line array to the ArrayList