2011-10-25 12 views
0

私は次のようなテキストファイルを持っています。どのように解析し、CellとEngineの単語を検索すればよいのでしょうか?Cell、Engine言葉。以下はtxtファイルです。私はすでに解析目的のためにtxtファイルに移動して以来、javaコードとして見ていません。txtファイルを解析して特定の単語を検索する

@Test 
    public void testGetMonsters() { 
     Cell cell11 = aBoard.getCell(1, 1); 
     theEngine = new Engine(theGame); 
    } 

    @Test 
    public void testDxDyPossibleMove() { 
     Cell cell11 = aBoard.getCell(1, 1); 
    } 

解析の所望の出力は次のようになります。

testGetMonsters class contains Cell and Engine words 
testDxDyPossibleMove class contains Cell word 
+0

は、これが混乱しています。あなたの問題を明確にして少し質問できますか? – Akron

+1

これは最初に尋ねたときとどのように違うのですか? –

+0

@あなたは両方の質問で答えなかったので、あなたのコメントのおかげで、私はここで質問を簡略化しようとしました –

答えて

0

Tadaaaaを!

package textsearch; 

import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
import java.net.URL; 
import java.text.ParsePosition; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class TextSearch { 

    public static void main(final String[] args) throws Exception { 

     final URL testFileURL = Thread.currentThread().getContextClassLoader().getResource("textsearch/test.txt"); 
     final File input = new File(testFileURL.toURI()); 
     final FileReader reader = new FileReader(input); 

     final SearchString search1 = new SearchString("Cell"); 
     final SearchString search2 = new SearchString("Engine"); 

     final List<SearchString> searches = new ArrayList<SearchString>(); 
     searches.add(search1); 
     searches.add(search2); 

     final Search search = new Search(searches); 

     try { 
      search.search(reader); 
     } finally { 
      reader.close(); 
     } 

     if(search.hasPositives()) { 
      System.out.print("File " + input.getName() + " contains the words "); 
      search.printPositives(); 
      System.out.println(""); 
     } else { 
      System.out.println("File " + input.getName() + " didn't contain any of the search terms."); 
     } 

    } 

    private static class SearchString { 

     final String searchString; 
     final ParsePosition pos; 

     SearchString(final String searchString) { 

      if(searchString == null || searchString.isEmpty()) 
       throw new IllegalArgumentException("I can't search for nothing!"); 

      this.searchString = searchString; 
      pos = new ParsePosition(0); 

     } 

     boolean checkNextChar(final char c) { 

      if(searchString.charAt(pos.getIndex()) == c) { 
       pos.setIndex(pos.getIndex() + 1); 
       if(pos.getIndex() >= searchString.length()) { 
        pos.setIndex(0); 
        return true; 
       } 
       return false; 
      } else { 
       pos.setIndex(0); 
       return false; 
      } 

     } 

     String getString() { 

      return searchString; 

     } 

    } 

    private static class Search { 

     private final List<SearchString> searches; 
     private final List<SearchString> positives; 

     Search(final List<SearchString> searches) { 

      this.searches = searches; 
      positives = new ArrayList<SearchString>(); 

     } 

     void search(final Reader reader) throws IOException { 

      int current; 

      while((current = reader.read()) != -1 && !searches.isEmpty()) { 

       char c = (char)current; 

       for(final Iterator<SearchString> it = searches.iterator(); it.hasNext();) { 
        final SearchString searchString = it.next(); 
        final boolean matches = searchString.checkNextChar(c); 
        if(matches) { 
         positives.add(searchString); 
         it.remove(); 
        } 
       } 

      } 

     } 

     boolean hasPositives() { 

      return !positives.isEmpty(); 

     } 

     void printPositives() { 

      for(final Iterator<SearchString> it = positives.iterator(); it.hasNext();) { 
       final SearchString searchString = it.next(); 
       System.out.print(searchString.getString()); 
       if(it.hasNext()) 
        System.out.print(", "); 
      } 

     } 

    } 

} 

申し訳ありませんが、100%信頼できるわけではありませんが、これが始まりです。

EDIT:またはKayKayが提案ようにあなたは、スキャナを使用することができる、そんなことしたいです:D

+0

最終的なURLのtxtファイルのリソースを追加したときtestFileURL = Thread.currentThread()。getContextClassLoader()。getResource( "C:/Desktop/test.txt");それは私にこのエラーを与える - >例外スレッド "メイン" java.lang.NullPointerException \tでtextsearch.TextSearch.main(TextSearch.java:18) –

+0

ええ、それはtext.tarchファイルがtextsearchパッケージにあると仮定します、クラスの隣に。あなたの場合、 'File(" C:/Desktop/test.txt ")'を使用すれば十分でしょう。私はきれいなコードで気にしませんでした、SearchStringとSearchクラスはすべて重要です。 –

+0

ああ、私はこれらのことに精通していませんが、あなたは素晴らしいですが、問題は、私が必要とするファイル全体を検索しているところです。これらの単語がどこにあるかを指定することです(testGetMonstersクラスにはCellが含まれています)。エンジンワード testDxDyPossibleMoveクラスにはセルワード –

1

おそらく、正規表現とJavaのパターンマッチング機能を使用したいです。たとえば、使用例としてRegular Expressions and the Java Programming Languageを見てください。

クイック例:あなたがでている場合は/どのようなクラスの決定

Pattern cellPattern = Pattern.compile("Cell"); 
    while (fileReader.ready()) { 
     String inputLine = fileReader.readLine(); 
     Matcher cellMatcher = cellPattern.matcher(inputLine); 
     if(cellMatcher.lookingAt()) { 
      //This line contains the word "Cell" 

は別の問題です...あなたはそのための「レクサー」必要があります。 JavaCCは良いスタート地点です。

0

私はここであなたの質問を理解しているか分からないが、いくつかのヒントがあります。

クラス名を取得するにはobj.getClass().getName()を使用してください。 文字列を検索するには、str.contains( "Cell")を使用するか、正規表現を使用します。クラスjava.util.Patternをご覧ください。

1

私はあなたのコードとあなたの質問が、間のリンクが表示されない:

String text = new Scanner(yourFile).useDelimiter("\\Z").next(); 
String wordsToLookFor = Arrays.asList("cell", "engine"); 

List<String> wordsContained = new ArrayList<String>(); 

for(String word : wordsToLookFor){ 
    if(text.contains(word)) { 
    wordsContained.add(word); 
    } 
} 

System.out.println(yourFile.getName() + " contains " + wordsContained); 
関連する問題