4

ここにはクエリ文とstackovの2つのクラスがあります。検索文クラスのオブジェクトを格納するために配列リストが使用されています。しかし、最近追加されたオブジェクトが前のオブジェクトを上書きしています。上書きされないようにオブジェクトを追加するにはどうすればよいですか?

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

    }
}   
4

4 に答える 4

7

問題は loop からではなく、 class から発生します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");

に 2 つのオブジェクトを追加するArrayListと、もちろんループ内で 2 つの結果が出力されます。ただし、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ます。これにより、次のようになります。getterssettersfor-statement

for(QuerySentence q : doclist)
{
    System.out.println("In loop : " + q.getLabel() + q.getQuery());
}
于 2013-03-12T08:57:52.697 に答える
1
doclist.add(qs1);
doclist.add(qs2);
于 2013-03-12T08:57:40.030 に答える