列表问题

时间:2015-11-24 16:12:27

标签: java list arraylist

我遇到了一个问题,我不知道为什么会这样。基本上,我试图将List中的所有元素传递给另一个类中的另一个List。我试图使用变量,get方法甚至List类中的addAll方法,但没有任何作用。我一直空着List ...

发生错误的地方:

public class ChecaOrtografia
{
    // instance variables - replace the example below with your own
   Dicionario dicionario = new Dicionario();
   Gramatica gramatica = new Gramatica();
   Frase frase = new Frase();   
   public List<String> listaFrases;
   public List<Item> listaDicionario;
   public List<String> listaGramatica;

    /**
     * Constructor for objects of class ChecaOrtografia
     */
    public ChecaOrtografia()
    {
        listaFrases = new ArrayList<>();
        this.listaFrases.addAll(frase.listaFrases);
        listaDicionario =  new ArrayList<>();
        this.listaDicionario.addAll(dicionario.listaItens);
        listaGramatica =  new ArrayList<>();
        this.listaGramatica.addAll(gramatica.listaRegras);
    }

请记住,我尝试过类似的事情:

listaFrases = frase.listaFrases;

listaFrases = frase.getFrases();

我主要课程的一部分:

public class corretorGramatical 
{       
  public static void main(String [ ] args) 
  {
   Dicionario dicionario = new Dicionario();
   Gramatica gramatica = new Gramatica();
   Frase frase = new Frase();
   ChecaOrtografia checador;
   List<String> saida = new ArrayList<>();
   Item a;
   String word, category, specification, frases;
   int contador = 0;
   char code;
   Scanner entry = new Scanner(System.in); 
loop:while (entry.hasNextLine()) { 
       code = entry.nextLine().charAt(0); 
   switch(code)
   {
      case 'd':
          System.out.println ("Diga quantas words seu dicionario tera");
          contador = entry.nextInt();
          entry.nextLine(); 
          for(int i = 0; i < contador; contador--) 
          {
            System.out.println ("Qual é a palavra?");
            word = entry.nextLine();
            System.out.println ("Qual a categoria?");
            category = entry.nextLine(); 
            a = new Item (word, category);
            dicionario.listaItens(a);

          }
      break;

      case 'g':   
         System.out.println ("Quantas linhas serão utilizadas para especificar a gramática?");
         contador = entry.nextInt();
         entry.nextLine();

         for(int j = 0; j < contador; contador--) 
         {
          System.out.println ("Qual é a especificação?");
          specification = entry.nextLine(); 
          gramatica.listaRegras(specification);

         } 
          break;

      case 'f':
            System.out.println ("Digite as frases que deseja checar");

            entry.nextLine();

             for(int f = 0; f < contador; contador--) 
         {
          System.out.println ("Qual é a frase?");
          frases = entry.nextLine(); 
          frase.listaFrases(frases); 
         } 
       checador = new ChecaOrtografia();
       saida = checador.checarOrtografia();
       break;

      case 's':
        break loop;
    }
  }

4 个答案:

答案 0 :(得分:1)

因为您正在再次创建这些类。它们不是您存储数据的那个。

您必须将数据从一个类传递到另一个类。您可以创建setter或在构造函数中传递它。

以下是使用构造函数的方法。

让你的构造函数接受3个类。

public ChecaOrtografia(Dicionario dicionario, Gramatica gramatica, Frase frase)
{
    listaFrases = new ArrayList<>();
    this.listaFrases.addAll(frase.listaFrases);
    listaDicionario =  new ArrayList<>();
    this.listaDicionario.addAll(dicionario.listaItens);
    listaGramatica =  new ArrayList<>();
    this.listaGramatica.addAll(gramatica.listaRegras);
}

现在将这些类传递给构造函数。所以我们可以在ChecaOrtografia类中获取数据。

checador = new ChecaOrtografia(dicionario, gramatica, frase);

并删除ChecaOrtografia类中这3个类的声明,因为您不再需要它了。

答案 1 :(得分:1)

每次调用ChecaOrtagrafia方法之前,您都会创建一个新的checarOrtagrafia。我假设您希望此实例了解dicionariogramatica对象中的值。但它不可能知道那些因为它没有对它们的引用。

因为在循环期间这两个对象没有改变,我怀疑你想要的是在ChecaOrtagrafia中存储对它们的引用,并且每次只传递一个Frase对象。你的课应该是这样的:

class ChecaOrtagrafia {
    private final Dicionario dicionario;
    private final Gramatica gramatica;
    public ChecaOrtagrafia(Dicionario dicionario, Gramatica gramatica) {
        this.dicionario = dicionario;
        this.gramatica = gramatica;
    }
    public List<String> checaGramatica(Frase frase) {
        ...
    }
}

它不太可能需要在这些类中拥有自己的列表副本。当您需要在checaGramatica中使用它们时,您应该访问原始类中的列表。

答案 2 :(得分:0)

在您的代码中,您没有在要添加的列表中放置任何内容。添加列表时,实际上是添加列表的元素,而不是列表本身。

答案 3 :(得分:0)

根据您到目前为止显示的代码,您将向另一个空列表添加一个空列表,因此在构建类时,添加为空的列表是正确的行为。

如果要将列表添加到另一个列表,则需要实际填充其中的一些元素。