将文本文件拆分为数组并查找数组中的元素

时间:2012-08-13 18:15:20

标签: java

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

alan 1000

lee 20

rodney 28

e.g。如果我的论点是lee,则该方法应打印出20。如果rodney28

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)
    {
    }
}

2 个答案:

答案 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循环无效,如果您点击它,则输出分别为lee1rodney1。如果您将其更改为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);
}