1

ファイルから入力を取得し、別のファイルで入力を検索するプログラムを作成しようとしています。たとえば、ファイル A から「車」という単語を取得し、単語の場所を出力します (単語が含まれている場合) ) ファイル B 内。

現在3クラスあります。メインクラス、ファイル入力を読み取るクラス、および別のファイルで入力を検索するクラス。

入力を読み取るクラスには、ファイルを取得し、ファイルを 1 行ずつ読み取り、各単語を変数に保存してから、これらの変数を arrayList に追加するコードがあります。

これはコードの一部です:

List<String> listOfWords = new ArrayList<String>();
     while((strLine = br.readLine()) != null){
          String [] tokens = strLine.split("\\s+");
          String [] words = tokens;
          for(String word : words){
              listOfWords.add(word);
              System.out.print(word);
              System.out.print(" ");      
          } 
        System.out.print("\n");  
    }
        in.close();
        return listOfWords;    
    }

次に、arrayList を取得して、外部ファイル内の単語を検索するコードを含むクラスに配置する必要があります。

これは、単語を検索するコードの一部です。

public void search(List<String> listOfWords) throws FileNotFoundException, IOException{

        FileInputStream fstream = new FileInputStream(getSearchFileName());

        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        while((strLine = br.readLine()) != null){
            for(String list: listOfWords){
            Pattern p = Pattern.compile(list);
            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();
                }
            }
          }  
}

コードはスタンドアロンで動作しますが、最初のコード セットから arrayList (listOfWords) を呼び出し、別のクラスにある 2 番目のコード セットでそれを使用するのに問題があります。

追加または調整する必要があるコードに関するヘルプをいただければ幸いです。

よろしく

4

5 に答える 5

3

これは範囲の問題のようです。クラス全体またはメソッド間でそのリストを使用する場合は、次のことを検討できます。

  1. 最初のメソッドのリストを返し、それをフィールドまたは変数に保存して、2番目のメソッドに渡します。
  2. リストをクラスフィールドにして管理します。そうすれば、両方のブロックが同じクラスにあると仮定して、コードの2番目のブロックでアクセスできるようになります。

このように、リストはコードの最初のブロック(whileループ)のスコープ内で定義されます。これは実際のメソッドの抽出であると私は推測します。メソッドが終了すると、リストはGCの対象になります(つまり、破棄されるのと同じくらい良好です)。

于 2012-12-18T14:47:47.307 に答える
1

メソッドの戻りタイプがリストされているはずです。次に、オブジェクト参照または静的変数によってそのメソッドを呼び出すことができます。

于 2012-12-18T14:47:49.530 に答える
1

私はあなたのトピックからあなたの質問に答えます:あなたは(関数本体の外で)クラス本体であなたの配列リストを定義し、それをパブリックとして設定する必要がありますそして(あなたがクラスを開始せずにアクセスしたいならそれを静的として設定するだけです) :

class A 
{

 public static List<String> listOfWords = new ArrayList<String>();
void func()
   {  
//......
while((strLine = br.readLine()) != null){
        String [] tokens = strLine.split("\\s+");
        String [] words = tokens;

        for(String word : words){
            listOfWords.add(word);
            System.out.print(word);
            System.out.print(" ");      
        } 
        System.out.print("\n");  
    }
    in.close();

}}

クラスBからアクセスする方法は次のとおりです。

 class B
{
   funcInClassB ()
 {
   myArrayList=A.listOfWords();
  }
 }
于 2012-12-18T14:54:48.203 に答える
1

あなたが抱えている問題は、変数のスコープを学習し、listOfWords を while ループの外に移動して定義することで理解できます。

List<String> listOfWords = new ArrayList<String>();
while((strLine = br.readLine()) != null){
            String [] tokens = strLine.split("\\s+");
            String [] words = tokens;
            for(String word : words){
                listOfWords.add(word);
                System.out.print(word);
                System.out.print(" ");      
            } 
            System.out.print("\n");  
        }
in.close();
return listOfWords;
于 2012-12-18T14:49:34.933 に答える
1

listOfWordsはローカル メソッド変数であり、そのスコープは while ループに制限されます。したがって、別の方法でアクセスすることはできません。それに対処するには、次の 2 つの方法があります。

  1. 最初のメソッドは戻ることができlistOfWords、 で呼び出されsearch()ます。
  2. 両方のメソッドが同じクラスにある場合はlistOfWords、クラス内のすべてのメソッドがアクセスできるクラス フィールドにすることができます。
于 2012-12-18T14:51:42.873 に答える