无法从Hashtable获得价值

时间:2016-05-27 15:32:30

标签: java regex string split hashmap

我编写了以下Java代码,

try {
    String str = "";
    Hashtable< String, String> table = new Hashtable< String, String>();
    fis = new FileInputStream("C:\\Users\\Dave\\Desktop\\station.txt");// FileInputStream
    isr = new InputStreamReader(fis); 
    br = new BufferedReader(isr); 

    String str1 = "012649-99999";
    String str2 = "012650-99999";
    while ((str = br.readLine()) != null) {
        String[] record = str.split("\t");
        table.put(record[0], record[1]);
    }           
    String stationName1 = table.get(str1);
    String stationName2 = table.get(str2);

} catch(...)

station.txt的内容如下:

012649-99999    SIHCCAJAVRI
012650-99999    TRNSET-HANSMOEN

当我运行程序时,stationName1始终为null,而stationName2可以获得值012650-99999。谁能告诉我为什么会这样?提前谢谢!

@matt:是的,这是正确的,当我将编码从'UTF-8'更改为'ANSI'时,它工作,stationName1可以获得值,但为什么'UTF-8'不适用于这种情况?我总是使用那种格式。

3 个答案:

答案 0 :(得分:3)

问题是您的文字文件不包含任何\t个字符。有多个空间。正确的方法是使用匹配mutliple空格的\\s+

String[] record = str.split("\\s+");

此外Hashtable已过时。现在有HashMap<>。这是完整的代码,适合我。我测试了它:

String str;
HashMap<String, String> table = new HashMap<>();
FileInputStream fis = new FileInputStream("station.txt");
InputStreamReader isr = new InputStreamReader(fis); 
BufferedReader br = new BufferedReader(isr); 

String str1 = "012649-99999";
String str2 = "012650-99999";

while ((str = br.readLine()) != null) {
    String[] record = str.split("\\s+");
    table.put(record[0], record[1]);
}           
System.out.println(table.get(str1));
System.out.println(table.get(str2));

答案 1 :(得分:1)

请您替换以下内容:

 String[] record = str.split("\t");

通过以下行:

String[] record = str.split("[\\s]+");

并查看结果?

您的工作解决方案在这里: -

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Hashtable;

public class Test {
    public static void main(String[] args) {
        try {
            String str = "";
            Hashtable< String, String> table = new Hashtable< String, String>();
            FileInputStream fis = new FileInputStream("C:\\Users\\Dave\\Desktop\\station.txt");// FileInputStream

            InputStreamReader isr = new InputStreamReader(fis); 
            BufferedReader br = new BufferedReader(isr); 

            String str1 = "012649-99999";
            String str2 = "012650-99999";
            while ((str = br.readLine()) != null) {
                System.out.println(str);
                String[] record = str.split("[\\s]+");
                table.put(record[0], record[1]);
            } 
            br.close();
            String stationName1 = table.get(str1);
            String stationName2 = table.get(str2);

            System.out.println("stationName1:"+stationName1);//
            System.out.println("stationName2:"+stationName2);//
        } catch(Exception e){
            System.out.println(e);
        }
    }

}

答案 2 :(得分:0)

如果您确定该文件包含TAB空间,则匹配的正确方法如下。

String[] record = str.split("\\t");  

split()的参数是一个正则表达式,TAB空间的正则表达式是\t,它作为Java字符串将是"\\t"

此外,请勿使用Hashtable,请使用HashMap,而不是另一个答案中所述。