3

我正在做一个项目,我们在其中插入键和值对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

定义;2

吉;3

...名称将是 abc

定义

4

2 回答 2

4

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

正如我们之前怀疑的那样,您的输入文件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);                                        
    }
}
于 2013-08-01T15:34:00.260 回答
3

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

如果您正在修改用作 hashMap 中的键的对象,您有两种选择:

  1. 将 HashMap 替换为 IdentityHashMap。这可能会产生意想不到的后果,因为具有相同 hashCode 的两个对象在从映射中放置/获取时将不再被认为是等效的,包括精确的克隆。
  2. 在以这种方式更改 hashCode 的方式更新键之前,将其从映射中删除,更新键,然后重新插入到映射中。
于 2016-03-22T03:14:21.360 回答