如何在Java中将一个对象添加到ArrayList中

4

这里有两个类,QuerySentence和Stackov。使用ArrayList存储QuerySentence类的对象。但是最近添加的对象正在覆盖之前的对象。如何添加对象以避免覆盖?

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--;
                }

    }
}   

请尝试正确缩进您的代码。此外,无需发布两个完整的类,只需发布ArrayList操作即可。 - Salvatorelab
4个回答

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,并为它们创建getterssetters。这样你的for循环语句应该像这样:
for(QuerySentence q : doclist)
{
    System.out.println("In loop : " + q.getLabel() + q.getQuery());
}

for循环显示错误,提示“类型不匹配:无法从元素类型Object转换为QuerySentence”。 - elsa
这是因为你将ArrayList声明为ArrayList<Object> doclist = new ArrayList<Object>();。请改用ArrayList<QuerySentence> doclist = new ArrayList<QuerySentence>(); - Rob

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

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);
                }

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接