1

您好,基本上我的目标是读取txt文件并将其存储在数组中并在方法参数之后打印数组元素。文本文件的格式如图所示(一行中每个字符串之间的空格)

alan 1000

lee 20

rodney 28

例如,如果我的论点是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)
    {
    }
}
4

2 回答 2

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 循环将不起作用,如果您点击它,您的输出将分别为lee1rodney1。如果您将其更改为arr[i+1],我假设您正在尝试这样做,如果数组中的最后一个项目匹配,它将因 IndexOutOfBoundsException 而崩溃pname


原始答案

这是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)来有效地存储和查找名称到数字的映射。因此,您可以使用解析文件并返回所有名称到数字的映射的方法,而不是使用获取文件名和名称来查找的方法,然后您可以简单地调用map.get("name")返回的映射来有效地获取给定人员的号码,而不必每次都重新读取文件。

于 2012-08-13T18:26:41.740 回答
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);
}
于 2012-08-13T18:24:15.820 回答