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ループは機能しません。ヒットした場合、出力はlee1またはrodney1それぞれになります。代わりに変更した場合arr[i+1]、これを実行しようとしていたと思いますが、配列の最後の項目が一致すると、IndexOutOfBoundsExceptionでクラッシュしpnameます。


元の回答

これは、スキャナーの理想的な使用例です。探しているコンテンツの文字列またはファイルを「スキャン」し、多くのユースケース、特に空白で区切られたファイルのファイル解析を劇的に簡素化します。

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]);
    }
  }
}

余談ですが、名前が一意であることがわかっている場合は、マップ(具体的には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 に答える