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

时间:2013-08-01 15:20:23

标签: java hashmap

我正在开发一个项目,我们在Map中插入键和值对。

如果密钥出现在Map中,我的代码将返回该密钥的值。

但是,即使密钥存在,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);
    }
}

我的输入文件是

ABC; 1

DEF; 2

GHI; 3

... 和名字将是 ABC

DEF

2 个答案:

答案 0 :(得分:3)

如果对象的hashCode在插入后发生更改,则会出现此问题。

答案 1 :(得分:2)

正在比较的字符串可能包含空格,换行符,换行符。

正如我们之前所怀疑的那样,您的输入文件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);                                        
    }
}