即使存在键,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}