即使存在键,Java HashMap也返回空值

即使存在键,Java HashMap也返回空值,java,hashmap,Java,Hashmap,我正在从事一个项目,在该项目中,我们在映射中插入键和值对 如果键存在于映射中,则“我的代码”将返回该键的值 但是,HashMap不会返回预期值,即使键存在 首先,我从一个文件中读取键和值对,然后读取另一个文件,该文件的键与第一个文件几乎相同 然后,我返回一些键的值,但对于其中许多键,该值为null 以下是我的代码片段: Scanner scanner = new Scanner(new FileReader("a.txt")); LinkedHashMap<String, String&

我正在从事一个项目,在该项目中,我们在
映射中插入键和值对

如果键存在于
映射中
,则“我的代码”将返回该键的值

但是,
HashMap
不会返回预期值,即使键存在

首先,我从一个文件中读取键和值对,然后读取另一个文件,该文件的键与第一个文件几乎相同

然后,我返回一些键的值,但对于其中许多键,该值为
null

以下是我的代码片段:

Scanner scanner = new Scanner(new FileReader("a.txt"));

LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();

while (scanner.hasNextLine())
{
   String[] columns = scanner.nextLine().split(";");
   map.put(columns[0], columns[1]);
}

System.out.println(map);

for (Map.Entry<String, String> entry : map.entrySet())
{ // name is the input of second file
    if (entry.getKey().equals(name)) 
    {
        num = entry.getValue();         
        fun(num);
    }
}
Scanner Scanner=新的扫描仪(新的文件阅读器(“a.txt”);
LinkedHashMap=新建LinkedHashMap();
while(scanner.hasNextLine())
{
String[]columns=scanner.nextLine().split(;);
map.put(列[0],列[1]);
}
系统输出打印项次(map);
对于(Map.Entry:Map.entrySet())
{//name是第二个文件的输入
if(entry.getKey().equals(name))
{
num=entry.getValue();
乐趣(num);
}
}
我的输入文件是

abc;一,

def;二,

ghi;三,

。。。 名字是 abc


def

正在比较的字符串可能有空格、换行符和换行符。

正如我们之前怀疑的那样,您的输入文件
train.txt
中有人尾随空格,这导致地图查找失败。此外,Java代码还有许多冗余的代码块。我已经把它打扫干净了。这是您修改过的代码:

import java.io.*;
import java.util.*;
public class ExampleClass1 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(new FileReader("trainnames.txt"));
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        while (scanner.hasNextLine()) {
            String[] columns = scanner.nextLine().split(";");
            map.put(columns[0].trim(), columns[1].trim());
        }
        scanner.close();
        System.out.println("******** map is: " + map);
        File file = new File("onn.csv"); // output file
        FileWriter fileWriter = new FileWriter(file);
        scanner = new Scanner(new FileReader("train.txt"));
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (line.charAt(0) == '>') {
                //System.out.println("==== line: [" + line + ']');      
                String num = map.get(line);
                no(num, fileWriter);
            }
        }
        scanner.close();
        fileWriter.close();
    }

    public static void no(String num, FileWriter fileWriter) throws IOException {
        fileWriter.append(num + ',' + System.getProperty("line.separator"));
        System.out.println(num);                                        
    }
}
import java.io.*;
导入java.util.*;
公共课范例1{
公共静态void main(字符串[]args)引发IOException{
Scanner Scanner=新扫描仪(新文件阅读器(“trainnames.txt”);
LinkedHashMap=新建LinkedHashMap();
while(scanner.hasNextLine()){
String[]columns=scanner.nextLine().split(;);
map.put(列[0].trim(),列[1].trim());
}
scanner.close();
System.out.println(“******映射为:“+map”);
File File=新文件(“onn.csv”);//输出文件
FileWriter FileWriter=新的FileWriter(文件);
scanner=新扫描仪(新文件阅读器(“train.txt”);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine().trim();
如果(行字符(0)='>'){
//System.out.println(“==行:[”+行+']);
String num=map.get(行);
否(num,fileWriter);
}
}
scanner.close();
fileWriter.close();
}
公共静态void no(String num,FileWriter FileWriter)引发IOException{
追加(num+','+System.getProperty(“line.separator”);
系统输出打印项数(num);
}
}

如果对象的哈希代码在插入后发生更改,则可能会出现此问题。

能否显示文本文件的外观?为什么使用for循环,而map.get(name)会执行此操作?我怀疑可能存在一些尾随或前导空格。使用map.get(name)也会返回空值请包含
System.out.printf(“@%s@\n”,name)
循环外部和
System.out.printf(“@%s@\n”,entry.getKey())
在循环内部,并用输出更新问题?
@将显示空格
\W
包含的字符远远多于空格。
replaceAll
将删除所有字符,而不仅仅是末尾的字符。您可以使用
name.trim()
删除尾随空格和前导空格。是的,您完全可以这样做,只从两端删除空格。显示
System.out.println(map);
System.out.println('['+name+']');
map的输出:1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月2日,1月2日,1月2日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月1日,1月2日,1月2,1日,1月2,1日,1月2,1日,2,2,2,5岁,2,2,5岁,2,5岁,2,5岁,2,2,5岁,2,5岁,5岁,2,2,5岁,5岁,2,2,1.5岁=2,1111111C=2,1=2,2,2,1年=2,2,11111C=2,2,2,111C=2,1.5,1,1 1DPRM1=3,1GSM1=3,1FOW=3,2LZGM=4,1BBNM=4,1CGO=4,1CPQ=4,2NMQM=4,1MTMP=4,1BUCM1=4,1FMPB=4,1BGC=5,1CNT1=5}