2016-04-13 10 views
0

このサイトをチェックしたところ、他の人には同様の問題があったようですが、静的フィールドが原因でした。私は2クラス、質問を拡張する質問クラスとScienceQuestionsクラスている:私はScienceQuestionsクラスをインスタンス化するとき今のArrayList sciQuestions内のすべての要素が同じでJava ArrayList.add()はarrayのすべての要素を最終要素に置き換えます

import java.util.*; 

public abstract class Questions { 

public int questionID; 
public int difficulty; 
public boolean bAsked; 
public String question; 
public ArrayList<String> answers; 
public String correctAnswer; 

public Questions addQuestion(int id, int dif, boolean asked, String q, ArrayList<String> ans, String correct) 
{ 
    questionID = id; 
    difficulty = dif; 
    bAsked = asked; 
    question = q; 
    answers = ans; 
    correctAnswer = correct; 
    return this; 
} 

}

import java.util.ArrayList; 

public class ScienceQuestions extends Questions 
{ 
public ArrayList<Questions> sciQuestions = new ArrayList<Questions>(); 

//Add default questions 
public ScienceQuestions() 
{  
    sciQuestions.add(0, addQuestion1()); 
    sciQuestions.add(1, addQuestion2()); 
    sciQuestions.add(2, addQuestion3()); 
    System.out.println(sciQuestions.get(0).question + " " + sciQuestions.get(1).question + " " + sciQuestions.get(2).question); 
} 

//question 1 
private Questions addQuestion1() 
{ 
    int questionID = 1; 
    int dif = 1; 
    boolean asked = false; 
    String question = "What is the chemical symbol for Magneisum?"; 
    ArrayList<String> answers = new ArrayList<>(); 
    String answer1 = "Mg", answer2 = "M", answer3 = "mg", answer4 = "MG"; 
    String correctAnswer = answer1; 
    answers.add(answer1); 
    answers.add(answer2); 
    answers.add(answer3); 
    answers.add(answer4); 
    Questions thisQ = addQuestion(questionID, dif, asked, question, answers, correctAnswer); 
    return thisQ; 
} 

//question 2 
private Questions addQuestion2() 
{ 
    int questionID = 1; 
    int dif = 2; 
    boolean asked = false; 
    String question = "What is the most accurate acceleration on Earth due to gravity as sea level?"; 
    ArrayList<String> answers = new ArrayList<>(); 
    String answer1 = "9.81 m/s", answer2 = "9.81 N/Kg", answer3 = "10 m/s^2", answer4 = "10 N/Kg"; 
    String correctAnswer = answer2; 
    answers.add(answer1); 
    answers.add(answer2); 
    answers.add(answer3); 
    answers.add(answer4); 
    Questions thisQ = addQuestion(questionID, dif, asked, question, answers, correctAnswer); 
    return thisQ; 
} 

//question 2 
private Questions addQuestion3() 
{ 
    int questionID = 1; 
    int dif = 2; 
    boolean asked = false; 
    String question = "What is the order of magnitude of the gravitational constant in standard units?"; 
    ArrayList<String> answers = new ArrayList<>(); 
    String answer1 = "*10^-10", answer2 = "*10^-13", answer3 = "*10^-12", answer4 = "*10^-11"; 
    String correctAnswer = answer4; 
    answers.add(answer1); 
    answers.add(answer2); 
    answers.add(answer3); 
    answers.add(answer4); 
    Questions thisQ = addQuestion(questionID, dif, asked, question, answers, correctAnswer); 
    return thisQ; 
} 
} 

をしています私は最後の要素として追加しました。何故ですか?

答えて

1

にワード・サイズを変更しました。

あなたは可能性:

import java.util.*; 

public class Questions { 

    public int questionID; 
    public int difficulty; 
    public boolean bAsked; 
    public String question; 
    public ArrayList<String> answers; 
    public String correctAnswer; 

    public Questions(int id, int dif, boolean asked, String q, ArrayList<String> ans, String correct) { 
     questionID = id; 
     difficulty = dif; 
     bAsked = asked; 
     question = q; 
     answers = ans; 
     correctAnswer = correct; 
    } 
} 

とScienceQuestions.classでextends Questionsを削除し、

私のサイズ以来場合にはできません
new Questions(questionID, dif, asked, question, answers, correctAnswer); 
+0

ありがとう、それは動作します。だから、私は新しい質問()をインスタンス化していなかったので、それがうまくいかなかったのは初めてだと推測しているので、addQuestion()はそのクラスの "インスタンス" – user3544582

+0

正確:あなたは1つのインスタンス/オブジェクトを作成し、このオブジェクトをarraylistに追加しました。しかし、それは参考になるので、新しいオブジェクトは作成されません。 addQuestionメソッド中にオブジェクトのプロパティを変更し、arraylistでget(index)を呼び出すと、各インデックスに対して同じオブジェクトが得られます。したがって、最後に設定したパラメータと同じです。 –

0

私は間違っているかもしれませんが、パラメータなしのコンストラクタを使用してarraylistをインスタンス化している可能性があります。これは、サイズが1のarraylistをインスタンス化するかもしれません。単にリストの末尾に追加を追加します(そして容量を増やさない)。ここで説明するようにおそらくあなたは、大きさとそれをインスタンス化する必要があります

Constructor with initial capacity

編集:あなたが唯一のインスタンスを作成し、プロパティを上書きする能力

+0

addQuestion(questionID, dif, asked, question, answers, correctAnswer); 

を置き換えますarraylistはまだ3 – user3544582

関連する問題