字符串标记符代码无法正确读取文件

时间:2014-11-18 15:10:30

标签: java stringtokenizer

我们正在学习类中HashMap数据结构的使用,并且我一直致力于一个我们在一个包含3列和一组行数的文件中读取的赋值。第一列是用户的全名,第二列是用户名,第三列是他们的密码。

import java.io.*;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Question2Client {
    public static void main(String[] args) throws IOException{
        Scanner in = new Scanner(System.in);
        System.out.println("Read the number file to read from.");
        ArrayList <String> list = new ArrayList<>();
        String filename = in.nextLine();
        File processes = new File(filename);
        Scanner inputFile = new Scanner(processes);
        String line, word;
        StringTokenizer token;
        HashMap <String, String> userDatabase = new HashMap<>();
        HashMap <String, String> fullName = new HashMap<>();

问题在于读取文件。我实现了上面的arraylist因为我之前遇到过StringTokenizer的问题。下面代码的逻辑是,只要有一个由选项卡消除的字符串,就会将其添加到列表中(代码从左到右读取,文件通过选项卡缩进分隔其条目)。注意:在调试之后,我已经确定了问题所在。

    while (inputFile.hasNext()){
        line = inputFile.nextLine();
        token = new StringTokenizer(line, "\t");
        while(token.hasMoreTokens()){
            word = token.nextToken();
            list.add(word);
        }
    }

从那里我获取列表中的第一个项目并将它们分配到hashmap中的适当位置。用户的全名是第二个HashMap的值,用户名是两个HashMaps的密钥,密码是第一个HashMap的值。稍后,我将添加代码以请求用户输入,如果密码与其用户名匹配,则会显示其信息(即通过userDatabase访问,显示来自fullName的信息)。

for (int i=0; i<list.size(); i++){
        String name = list.remove(0);
        String uname = list.remove(0);
        String pass = list.remove(0);
        userDatabase.put(uname, pass);
        fullName.put(uname, name);
    }

问题在于while循环:StringTokenizer没有正确排除,我不确定原因。 HashMaps的代码很好(我已经在不同的应用程序中使用了它和变体),但是StringTokenizer有效地将整行命名为变量&#39; word&#39;然后将其添加到列表中。输出如下:

run:
Read the number file to read from.
MapTest.txt
[Ichabod Crane   icrane  qwerty123, Brom Bones  bbones  pass456!, Emboar Pokemon  epokemon    password123, Rayquaza Pokemon    rpokemon    drow456, Cool Dude   cdude   gh456!32, Trend Chaser    tchaser xpxo567!, Chuck Norris    cnorris power332*, Drum Dude   ddude   jflajdljfped]
[Trend Chaser    tchaser xpxo567!, Emboar Pokemon  epokemon    password123]
[Rayquaza Pokemon    rpokemon    drow456, Ichabod Crane   icrane  qwerty123]
BUILD SUCCESSFUL (total time: 11 seconds)

有人可以向我解释我的代码在StringTokenizer中出错了吗?

编辑:这是文本文件,仅使用空格,制表符和新行格式化:

Ichabod Crane   icrane  qwerty123
Brom Bones  bbones  pass456!
Emboar Pokemon  epokemon    password123
Rayquaza Pokemon    rpokemon    drow456
Cool Dude   cdude   gh456!32
Trend Chaser    tchaser xpxo567!
Chuck Norris    cnorris power332*
Drum Dude   ddude   jflajdljfped

为了便于理解,请将其视为以下列中的组织:

Ichabod Crane       icrane      qwerty123
Brom Bones          bbones      pass456!
Emboar Pokemon      epokemon    password123
Rayquaza Pokemon    rpokemon    drow456
Cool Dude           cdude       gh456!32
Trend Chaser        tchaser     xpxo567!
Chuck Norris        cnorris     power332*
Drum Dude           ddude       jflajdljfped

1 个答案:

答案 0 :(得分:0)

列出StringTokenizer中的所有分隔符,或删除此参数作为默认值:" \t\n\r\f"

new StringTokenizer(line, " \t\n\r\f,;.?!");

评论后:

使用String.split:

在没有StringTokenizer的情况下执行此操作
    line = inputFile.nextLine();
    String[] lineWords = line.split("(\t|\\s\\s+)", 3);
    Collection.addAll(list, lineWords);

如你所见,我也不相信“tab”字符是否是真正的标签,并且还使用两个或多个空格作为分隔符。