2016-05-15 15 views
1

最初に私は初心者で、これが私の最初のJavaプログラムだと言いたいと思います。テキストファイルを読み込んで特定の行を探し、それを文字列変数に保存するプログラムを作りたいと思います。txtファイルの特定のテキストを検索し、それをストリングに保存する

"Dealt to"で始まる行を見つけて、その行でそれ以降のすべてをこのchar '['までコピーして、それを文字列変数に入れます。

それでは、私は、テキストファイルに次の行を持っているとしましょう: は私のニックネーム[テキスト] に配ら私は、テキスト「私のニックネーム」を見つけると私の文字列変数に入れますプログラムを持っていると思います。

私はクラスで作業しようとしていて、セッターとゲッターを練習するだけで、自分のコードがどのように見え、どのように改善して動作させるのか教えてください。

これはMain.javaです:

import java.io.IOException; 

public class Main { 
    public static void main(String[] args) throws IOException{ 
     HandHistory hh1 = new HandHistory(); 
     String hero1 = null; 

     hero1 = hh1.getHero(); 
     System.out.println(hero1); 

    } 
} 

マイHandHistory.java:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
public class HandHistory { 

    private String hero; 

    public HandHistory(){} 

    public String getHero() throws IOException { 
     FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt"); 
     BufferedReader br = new BufferedReader(in); 

     String line; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("Dealt to ")){ 
       hero = line.substring(9,(line.indexOf("["))-1); 

      } 
     }     
     return hero; 
    } 

    public void setHero(String hero){ 
     this.hero = hero; 
    } 
} 

答えて

1

私のアドバイスは、正規表現を使用することです。あなたは読むためにJavaでhttp://www.tutorialspoint.com/java/java_regular_expressions.htm

+0

こんにちはレオネル、リンクありがとうございます! Regexを使う方が良い理由は、それは速いのか他の理由ですか? –

+0

これは一般的に高速です。もう1つの方法は、テキスト内の各文字をループして開始文字列と終了文字列を見つけようとすることです。これはコード化するのが非効率的で難しい(私の意見)。 –

2

それは良いスタートだ、良い方法を正規表現を使用するため、このチュートリアルを試してみてくださいだから、あなたの問題のために、これは

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexMatches 
{ 
    public static void main(String args[]){ 

     // String to be scanned to find the pattern. 
     String line = "Dealt to My NickName [text]"; 
     String pattern = "(?<=Dealt to)(.*\n?)(?=[)"; 

     // Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 

     // Now create matcher object. 
     Matcher m = r.matcher(line); 

     //m now haves what you desire. You can loop it if you want. 
     if (m.find()) { 
     System.out.println("Found value: " + m.group(0)); 
     System.out.println("Found value: " + m.group(1)); 
     System.out.println("Found value: " + m.group(2)); 
     } else { 
     System.out.println("NO MATCH"); 
     } 
    } 
} 

だろう

(?<=beginningstringname)(.*\n?)(?=endstringname) 

で試すことができます行ごとにファイルを作成します。一つの問題に値するの固定は、try-finallyブロックを使用してFileReaderのリソースを閉じている、またはJava 7の新しい試み - と、リソースブロック以降:

try (FileReader in = new FileReader("G:/Java/workspace/HandHistory/src/File.txt")) { 
    ... 
} 

その他のヒントやコメントは、私が考えることができます

  • 実際には必要ない場合は、クラスにセッターを置く必要はありません。
  • 「行儀が良い」という文字列が含まれていても、始まっていない行があるとコードが機能しませんその文字列。例えば。 "Foobar Deal to My NickName [text]"はまだ一致しますが、間違った値を返します
  • "Dealt to"で始まる行だけを一致させたい場合は、String.containsの代わりにString.startsWith()を使用します。 ()
  • 文字列に "["が含まれていないとケースを処理する必要があります。そうでなければ、わかりにくいエラーでコードがクラッシュする
  • コードから複雑さを取り除く場合、あなたのケースでは、比較的簡単にstartsWithとindexOfを使用することで問題を解決できます。この場合、RegExpsは使用しません。
  • HandHistory.getHero()は実際のコードを見ることなく何をしているのかは分かりません。クラスやメソッドが実際に行っていることを表現するものに名前を割り当てることは、自分自身にとっても非常に役に立ちます。
  • getHero()メソッドはあまりにも多くのことを行い、HandHistoryクラスもそうだと言えますが、こんにちは、こんにちは世界の例よりも大きなコードを使用するときには、それは多分考慮する必要があります。
+0

良いアドバイス。私は、 'HandHistory'のコンストラクタが何もしない場合、省略することができると付け加えます。 Javaはデフォルトの引数なしのコンストラクタを想定します。 –

+0

こんにちはjhncz、助けてくれてありがとう、あなたが言ったすべてのことは、コードの一部を変更します。 –

関連する問題