我们正在学习类中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
答案 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”字符是否是真正的标签,并且还使用两个或多个空格作为分隔符。