你好基本上我的目标是读取txt
文件将其存储在数组中并在方法参数后打印数组元素。文本文件如图所示格式化(行上每个字符串之间的空格)
alan 1000
lee 20
rodney 28
e.g。如果我的论点是lee
,则该方法应打印出20
。如果rodney
则28
public class practice
{
public void dataReader(String fName, String pname)
{
try
{
FileReader fr=new FileReader(fName);
BufferedReader br=new BufferedReader(fr);
String[] a={};
String line= br.readLine();
while(line !=null)
{
a= line.split(" "); // deliminator white space
}
for(int i=0; i <a.length; i++)
{
if(a[i].equals(pname))
{
System.out.println(a[i]+1);
}
}
}
catch(IOException e)
{
}
}
答案 0 :(得分:5)
您发布的代码无效,因为您只读过第一行,然后永远遍历该行。
您的代码,修剪和注释:
String line= br.readLine(); // returns the first line of the file
while(line !=null) { // checks if the line is null - it's not at the first line
a= line.split(" "); // deliminator white space
}
// we never get here, because nowhere in the loop do we set line to null
您需要在循环中调用br.readLine()
,直到它返回null,如下所示:
BufferedReader br=new BufferedReader(new FileReader(fName));
String line= br.readLine(); // reads the first line, or nothing
while(line != null) {
a= line.split(" "); // deliminator white space
String[] arr = line.split("\\s+"); // splits a string by any amount of whitespace
if(arr.length >= 2 && arr[0].equals(lookup)) {
System.out.println(arr[1]);
}
line = br.readLine(); // this will eventually set line to null, terminating the loop
}
原始代码中的for循环无效,如果您点击它,则输出分别为lee1
或rodney1
。如果您将其更改为arr[i+1]
,我认为您尝试这样做,如果数组中的最后一项与pname
匹配,则会因IndexOutOfBoundsException而崩溃。
原始回答
这是Scanner的理想用例。它“扫描”一个字符串或文件以查找您正在寻找的内容,从而大大简化了许多用例的文件解析,特别是以空格分隔的文件。
public void searchFile(String fName, String lookup){
Scanner in = new Scanner(new File(fName));
// Assumes the file has two "words" per line
while(in.hasNext()){
String name = in.next();
String number = in.next():
if(name.equals(lookup){
System.out.println(number);
}
}
}
如果您不能使用扫描程序来解析每一行,您仍然可以使用它来简化每行的读取,然后执行更复杂的行解析,如下所示:
public void searchFile2(String fName, String lookup){
Scanner in = new Scanner(new File(fName));
while(in.hasNextLine()){
String line = in.nextLine();
String[] arr = line.split("\\s+"); // splits a string by any amount of whitespace
if(arr[0].equals(lookup)){
System.out.println(arr[1]);
}
}
}
顺便说一句,如果您知道名称将是唯一的,则可以使用Map(特别是HashMap)来有效地存储和查找名称到数字的映射。因此,您没有一个方法来获取文件名和名称来查找,而是有一个解析文件并返回所有名称到数字的映射的方法,然后您只需调用{{1} }}在返回的地图上有效地获取给定人数,而不必每次都重新读取该文件。
答案 1 :(得分:2)
您应该使用Dictionary对象
Dictionary<String, Integer> wordPairs = new Dictionary<String, Integer>();
while(br.ReadLine())
{
wordPairs.put(a[0], Integer.parseInt(a[1]));
}
要获取该号码,只需使用键名在字典中查找。
public int getNumber(string name)
{
return wordPairs.get(name);
}