2013-03-12 2 views
4

Вот два класса, предложение предложения и stackov. Аррайалист используется для хранения объектов класса предложений запроса. Но недавно добавленный объект переопределяет предыдущий. Как добавить объекты, чтобы они не были переопределены?Как добавить объект в ArrayList в java

QuerySentence.java

public class QuerySentence { 

    public static String query; 
    public static String label; 
    public QuerySentence(){ 

    } 
    public QuerySentence(String query,String label){ 
     this.query = query; 
     this.label = label; 
    } 
} 

Stackov.java

package QueryClassifier; 

import java.util.ArrayList; 

public class stackov { 

    public static void main(String args[]) 
    { 
     QuerySentence qs1 = new QuerySentence("What state produces the best lobster to eat","LOCATION"); 
     QuerySentence qs2 = new QuerySentence("What is Dick Clark's birthday","DATE"); 
     ArrayList<Object> doclist = new ArrayList<Object>(); 

      doclist.add(0,qs1); 
      doclist.add(1,qs2); 

      int size = doclist.size(); 
       while(size>0) 
       { 
        QuerySentence qs3 = (QuerySentence) doclist.get(size-1); 
        System.out.println("\nin loop : " + qs3.label + qs3.query); 
        size--; 
       } 

    } 
} 
+0

пытаются отступы ваш код правильно. Также нет необходимости публиковать два целых класса, просто отправляйте манипуляции 'ArrayList'. – TheBronx

ответ

7

Проблема не приходит из вашего цикла, но из вашего класса QuerySentence. Вы создаете статические объекты, а это означает, что вы не создаете разные поля для разных экземпляров ваших классов, но класс будет иметь только уникальную копию. Так что здесь происходит, вы назначая эти значения к классу QuerySentence:

QuerySentence qs1 = new QuerySentence("What state produces the best lobster to eat","LOCATION"); 

А потом стер это капелька это одно:

QuerySentence qs2 = new QuerySentence("What is Dick Clark's birthday","DATE"); 

Как добавить два объекта в вашем ArrayList, конечно в вашем цикле вы напечатаете два результата. Но только результаты в qs2. Удалить static из ваших деклараций полей, и он будет работать нормально:

public String query; 
public String label; 

Вам не нужно индексировать ваши предложения запроса во время добавления.

doclist.add(qs1); 
doclist.add(qs2); 

И вы также можете улучшить свою петлю. Вы можете просто сделать:

ArrayList<QuerySentence> doclist = new ArrayList<QuerySentence>(); 

// some code... 

for(QuerySentence q : doclist) 
{ 
    System.out.println("In loop : " + q.label + q.query); 
} 

Пожалуйста, помните, Java конвенции: ваши классы должны начинаться с заглавной буквы (Stackov). Если вы также работаете над инкапсуляцией, лучше объявить свои поля private и создать для них getters и setters. При этом ваш for-statement должен выглядеть следующим образом:

for(QuerySentence q : doclist) 
{ 
    System.out.println("In loop : " + q.getLabel() + q.getQuery()); 
} 
+0

Цикл for показывает ошибку "for (QuerySentence q: doclist)" как "Несоответствие типа: невозможно преобразовать из типа элемента Object в QuerySentence" –

+0

Это потому, что вы объявили свой ArrayList как 'ArrayList doclist = new ArrayList () ; '. Используйте 'ArrayList doclist = new ArrayList ();' вместо этого. – Rob

+0

Спасибо. это решило мою проблему. –

0

индекс не требуется добавить, как этот

doclist.add(qs1); 
doclist.add(qs2); 
0
 public static void main(String args[]) 
     { 
      QuerySentence qs1 = new QuerySentence("What state produces the best lobster to eat","LOCATION"); 
      QuerySentence qs2 = new QuerySentence("What is Dick Clark's birthday","DATE"); 
      ArrayList<QuerySentence> doclist = new ArrayList<QuerySentence>(); 

       doclist.add(qs1); 
       doclist.add(qs2); 

       for(QuerySentence sent: docList) 
       { 
        System.out.println("\nin loop : " + sent.label + sent.query); 
       } 

     } 
Смежные вопросы