1

我正在尝试制作一个程序,该程序从文件中获取输入,然后在不同的文件中搜索输入,例如,它从文件 A 中获取单词“car”并输出单词的位置(如果包含该单词) 在文件 B 中。

目前我有3节课。一个主类,一个读取文件输入的类和一个在另一个文件中搜索输入的类。

读取输入的类具有获取文件的代码,逐行读取文件并将每个单词保存到变量中,然后将这些变量添加到 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)并在第二组代码中使用它,它们位于不同的类中。

任何有关我需要添加或调整的代码的帮助将不胜感激。

问候

4

5 回答 5

3

这似乎是一个范围问题。如果您要在一个类或方法之间使用该列表,您可以考虑:

  1. 返回第一种方法的列表,将其保存在字段或变量中并将其传递给第二种方法。
  2. 使列表成为类字段并对其进行管理。这样你就可以在第二个代码块中访问它,假设两个块都在同一个类上。

实际上,该列表是在第一个代码块(循环)的范围内定义的while,我认为它是实际方法的摘录。一旦方法完成,列表就符合 GC 条件(换句话说,与丢弃一样好)。

于 2012-12-18T14:47:47.307 回答
1

您的方法返回类型应该列出。然后您可以通过对象引用或静态变量调用该方法。

于 2012-12-18T14:47:49.530 回答
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 循环。因此它不能被其他方法访问。有两种处理方法:

  1. 第一个方法可以返回listOfWords并被调用search()
  2. 如果两个方法在同一个类中,listOfWords则可以是一个类字段,该类中的所有方法都可以访问。
于 2012-12-18T14:51:42.873 回答
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 回答