从另一个类中的方法访问ArrayList

时间:2012-12-18 14:43:50

标签: java netbeans java-6

我正在尝试创建一个从文件中获取输入然后在不同文件中搜索输入的程序,例如,它从文件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)并在第二组代码中使用它,这些代码位于不同的类中。

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

此致

5 个答案:

答案 0 :(得分:3)

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

  1. 在第一个方法上返回列表,将其保存在字段或变量中,并将其传递给第二个方法。
  2. 将列表设为类字段并进行管理。这样你就可以在第二个代码块中访问它,假设两个块都在同一个类中。
  3. 实际上,列表是在第一个代码块(while循环)的范围内定义的,我认为它是实际方法的摘录。方法完成后,该列表符合GC的条件(换句话说,就像丢弃一样好。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

通过学习变量范围,移动和定义listOfWords,可以理解您遇到的问题。

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;

答案 3 :(得分:1)

listOfWords是一个局部方法变量,其范围仅限于while循环。因此,其他方法无法访问它。有两种方法可以解决它:

  1. 第一种方法可以返回listOfWords,并在search()
  2. 中调用
  3. 如果两个方法都在同一个类中,listOfWords可以是一个类字段,可以访问该类中的所有方法。

答案 4 :(得分: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();
  }
 }