2012-12-12 5 views
1

작성하려는 프로그램은 사용자 정의 파일에서 단어를 가져 와서 해당 단어를 변수로 저장 한 다음 다른 사용자 정의 파일에서 해당 단어를 검색하는 프로그램입니다 단어, 거기에 출력 위치.외부 파일에서 여러 단어 동시 검색 (Java)

프로그램은 프로그램이 단어를 가져 와서 변수로 저장하는 지점까지 작동합니다. 프로그램의 문제점은 검색 메소드가 널 (null) 결과를 리턴한다는 것입니다. 필자의 주된 의문은 검색 메서드의 코드가 read 메서드의 코드와 호환되지 않거나 두 메서드가 동시에 실행되지 않는다는 것입니다.

검색 방법은 검색 클래스에 있고 읽기 메서드는 읽기 클래스에 있습니다.

여기 내 코드 3 개가 모두 포함되어 있습니다. 모든 수입에 대해 변상을 부탁드립니다.

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 

class Reading { 
private String file; 
public void setFileName(String fileName){ 
    file = fileName; 
} 
public String getFileName(){ 
    return file; 
} 
public void read(){ 
    try{ 
     //Choosing the file to open 
     FileInputStream fstream = new FileInputStream(getFileName()); 

     //Get the object of datainputstream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine = null; 

     //Read the file line by line 
     while((strLine = br.readLine()) != null){ 
      //  \\s+ means any number of whitespaces between tokens 
      String [] tokens = strLine.split("\\s+"); 
      String [] words = tokens; 
      for(String word : words){ 
       System.out.print(word); 
       System.out.print(" "); 

       Searching SearchingObject = new Searching(); 
       SearchingObject.setWord(word); 
      } 
      System.out.print("\n"); 
     } 
     in.close(); 
    } 
    catch(Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
} 

이 제 클래스이다 : 어떤 도움이 크게 인식 될 것이다

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

class Searching { 
private String file1; 
public void setFileName(String fileName){ 
    file1 = fileName; 
} 
public String getFileName(){ 
    return file1; 
} 
private String word1; 
public void setWord(String wordName){ 
    word1 = wordName;  
} 
public String getWord(){ 
    return word1; 
} 

public void search() throws FileNotFoundException{ 

    try{ 
     //Choosing the file to open 
     FileInputStream fstream = new FileInputStream(getFileName()); 

     //Get the object of datainputstream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine = null; 

     while((strLine = br.readLine()) != null){ 

      Pattern p = Pattern.compile(getWord()); 
      Matcher m = p.matcher(strLine); 

     int start = 0; 
     while (m.find(start)) { 
      System.out.printf("Word found: %s at index %d to %d.%n", m.group(), m.start(), m.end()); 
      start = m.end(); 
       } 
      }   
    } 
    catch(Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
} 
} 

import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Combination{ 

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

    Scanner userInput = new Scanner(System.in); 
    Reading ReadingObject = new Reading();   
    System.out.println("Please enter the file that you wish to open"); 
    String temp = userInput.nextLine(); 
    ReadingObject.setFileName(temp); 
    ReadingObject.read(); 
    Scanner searchForWord = new Scanner(System.in); 
    Searching SearchingObject = new Searching(); 
    System.out.println("Please enter the file that you would like to search for these words in"); 
    String temp1 = searchForWord.nextLine(); 
    SearchingObject.setFileName(temp1); 
    SearchingObject.search(); 

}  
} 

이 제 클래스이다

이 제 클래스이다.

감사합니다.

+0

팔로우 규칙을 호출합니다. 그들은 당신의 코드를 읽기 쉽게 만든다. – tucuxi

+0

또한 여러 클래스를 하나의 코드 스 니펫에 붙여 넣습니다. 몇 가지 발췌 문장을 만들거나 추가 클래스를 정적 ​​내부 클래스로 변환하십시오. – tucuxi

+0

팁 주셔서 감사합니다. 나는 프로그래밍과이 사이트에 처음 온 사람이다. 나는 가변 자본화를 제외하고는 그에 따라 조정을했다. 각 클래스를 분리하여 놓으면 코드를 쉽게 볼 수 있습니까? – Digitalwolf

답변

1

코드를 읽기가 어렵습니다. 귀하의 reading 클래스는 읽기뿐만 아니라; 그것은 또한 검색합니다. 의도 한 용도로 반영해야합니다. 그러나 검색 대상을 searching 개체에게 알려주는 것을 잊어 버리고이 개체에 대한 참조를 다른 사람에게 전달하지 않습니다. 이 스 니펫에서

for (String word : words) { 
    System.out.print(word); 
    System.out.print(" "); 

    searching searchingObject = new searching(); 
    searchingObject.setWord(word); 
} 

본질적으로 아무 것도하지 않습니다. searchingObject에 대한 참조는 영원히 손실됩니다.

reading 클래스는 검색 객체를 인스턴스화하는 대신 searching에서 검색 할 단어의 ArrayList를 유지해야합니다.

귀하의 searching 클래스는 생성자 매개 변수로 이러한 ArrayList 중 하나를 취하여 검색 할 단어 당 한 번씩 파일을 읽는 것보다 훨씬 효율적인 단일 정규식으로 변환해야합니다. 단일 정규 표현식 "a | b | c"를 사용하여 "a", "b"및 "c"를 검색 할 수 있습니다. 긴 단어들로도 작동합니다. 문제를 피하기 위해 먼저 그들을 탈출하십시오.

아, 명명 가이드 라인을 따르십시오. , variablesDoNot을 ClasNamesStartWithCaps : 당신의 readingTokenReader하고 searchingWordListSearcher ...

+0

복잡한 패턴을 검색 할 필요가없고 정확한 철자가 정확한 단어에만 관심이있는 경우 정규식 대신 HashSet 의 .contains (word) 메소드를 사용하십시오. 더 빠르고 읽기 쉽습니다. 정규 표현식 이스케이프 문제 없음 – tucuxi

+0

조언을 주셔서 감사합니다. 명명 지침에 대해 유감스럽게 생각합니다. 저는 Java에 익숙하지 않습니다. 제가 아는 모든 것은 독학입니다. 내 "읽기"수업도 검색하는 것이 내 의도는 아니었고 나는 searchingObject를 추가하여 검색 클래스에서 읽기 클래스에 액세스 할 수 있다고 생각했습니다. 귀하의 대답은 내 질문을 해결하고 내 실수를 봅니다. 감사합니다. – Digitalwolf

+0

Re Java : 프로그래밍 언어를 배우는 가장 좋은 방법은 좋은 개발자가하는 일을 보는 것입니다. NetBeans에서 * any * 클래스 이름을 Ctrl + 클릭하고 해당 클래스가 제공 한 소스를 볼 수 있습니다. String, System, File, ... 표준 라이브러리의 소스를 살펴보면 아주 좋은 예입니다. – tucuxi

관련 문제