2016-03-01 2 views
2

Я начинаю разработку Android-приложений. Код ниже - это приложение для викторины, и я хочу, чтобы он задавал случайные вопросы и не повторял вопрос, я пытался использовать флаг2 для случайного генерации вопросов, но я получал ошибки компиляции, может ли кто-нибудь помочь мне с этим. Я также новичок в Java.Android - случайный массив Loop и не повторяется

TextView tv; 
Button btn1; 
RadioButton rb1,rb2,rb3; 
RadioGroup rg; 

String Questions[]={"What is 1+1?","Capital of USA?","What is 2+2","Echo with Laughter","Warg"}; 
String opt[]={"2","3","4", "New York","Washington DC","Maryland", "5","4","6","Stairway to Heaven","Hotel California","Highway to hell","Jon","Bran","Dario" }; 
String ans[]={"2","Washington DC","4","Stairway to heaven","Bran"}; 



int flag=0; 
public static int correct; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    tv=(TextView)findViewById(R.id.textView2); 
    btn1=(Button)findViewById(R.id.button2); 
    rg=(RadioGroup)findViewById(R.id.radioGroup); 
    rb1=(RadioButton)findViewById(R.id.radioButton); 
    rb2=(RadioButton)findViewById(R.id.radioButton2); 
    rb3=(RadioButton)findViewById(R.id.radioButton3); 

    tv.setText(Questions[flag]); 
    rb1.setText(opt[0]); 
    rb2.setText(opt[1]); 
    rb3.setText(opt[2]); 

    btn1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RadioButton uans = (RadioButton) findViewById(rg.getCheckedRadioButtonId()); 
      String ansText = uans.getText().toString(); 

      if (ansText.equalsIgnoreCase(ans[flag])) { 
       correct++; 
      } 
      else { 
       Intent in = new Intent(getApplicationContext(),Token.class); 
       startActivity(in); 
      } 
      flag++; 
      if (flag < Questions.length) { 
       tv.setText(Questions[flag]); 
       rb1.setText(opt[flag * 3]); 
       rb2.setText(opt[(flag * 3)+1]); 
       rb3.setText(opt[(flag * 3)+2]); 
      } 
      else { 

       Intent in = new Intent(getApplicationContext(),Token.class); 
       startActivity(in); 
      } 

     } 

ответ

0

EDIT:

Это происходит из-за время идет бесконечные, новые декларации в списках:

Random random = new Random(); 
     String rightAnswer=null; 
     List<String> questions=new ArrayList<String>(); // list of questions 
     List<String> answers=new ArrayList<String>(); // list of answers 

    String[] ques={"What is 1+1?","Capital of USA?","What is 2+2","Echo with Laughter","Warg"}; 
      questions.addAll(Arrays.asList(ques)); 

    String[] ans={"2","Washington DC","4","Stairway to heaven","Bran"};  
      answers.addAll(Arrays.asList(ans)); 

    ArrayList<String[]> options = new ArrayList<String[]>(); // list of arrays that holds options 

    String[] opt1={"2","3","4"}; 
    String[] opt2={"New York","Washington DC","Maryland"}; 
    String[] opt3={"5","4","6"}; 
    String[] opt4={"Stairway to Heaven","Hotel California","Highway to hell"}; 
    String[] opt5={"Jon","Bran","Dario" }; 
    options.add(opt1); 
    options.add(opt2); 
    options.add(opt3); 
    options.add(opt4); 
    options.add(opt5); 

А где вы хотите создать вопрос, который вы можете написать этот код, я предполагаю, что в OnClick() Баттон:

int questionNumber; 
    if(questions.size()>0) // only run if list contains something 
    { 

    questionNumber = random.nextInt(questions.size()); // generate random question from current list 

    String[] currentOptions=options.get(questionNumber); 

    tv.setText(questions[questionNumber]); 
    rb1.setText(currentOptions[0]); 
    rb2.setText(currentOptions[1]); 
    rb3.setText(currentOptions[2]); 


    rightAnswer=answers.get(questionNumber); // hold right answer in this variable 

    questions.remove(questionNumber); // remove question which is asked 
    answers.remove(questionNumber); // remove answer which is asked 
    options.remove(questionNumber); // remove options that are showed 


    } 
    else 
    { 
    tv.setText("No questions remaining"); 
    } 

Это проверено, и я был в состоянии получить эти результаты: enter image description here

ПРИМЕЧАНИЕ: Декларационная часть должна быть вне функции, которая генерирует случайный вопрос, иначе она не удастся.

+0

Это сработало для меня, но я не могу перейти к следующему вопросу, и это дает мне ошибку «Слишком большой объем». – Moushfiq

+0

См. Редактирование, которое я сделал. – Talha

1

использование java.lang.Math.random(). он будет возвращать значение от 0,0 до 0,1 преобразовать эти значения в целом & получить вопрос о целочисленных

1

Генерация случайных чисел в пределах диапазона, который здесь будет от 0 до максимального количества вопросов, вы можете сделать это, как показано ниже:

int numberOfQuestion = 5; 
Random rn = new Random(); 
randomNum = rn.nextInt() % numberOfQuestion; // random number from 0 to MaxRange - 1 

Вместо того, чтобы использовать три массива вы можете создать класс:

class Quiz{ 
    String question; 
    String answer; 
    String[] options; 
    boolean asked; 
} 

И каждый раз, когда конкретный вопрос задают только сделать флаг asked в TRU e, и перед тем, как задавать вопрос, просто проверьте, задан ли этот вопрос, или нет, если нет, то только показывается вопрос.

1

Три строки массив фактических бесполезно. Вы должны использовать объект ArrayList.

public class QuestionObject{ 
    int id; 
    String question; 
    String [] options; 
    String answer; 
    --you should implement getter and setter-- 
    public int getId(){ 
     return this.id; 
    } 
    public void setId(int id){ 
     this.id= id; 
    } 
    public String getQuestion(){ 
     return this.question; 
    } 
    public void setQuesion(String question){ 
     this.question = question; 
    } 
    public String[] getOptions() 
    { 
     return options; 
    } 

    public void setOptions(String[] options) 
{ 
    this.options= options; 
    } 

    public int getOptionsElement(int location) 
    { 
     return options[location]; 
    } 

    public void setOptionsElement(int value, int location) 
    { 
    options[location] = value; 
    } 
    public String getAnswer(){ 
     return this.answer; 
    } 
    public void setAnswer(String answer){ 
     this.answer= answer; 
    } 
} 

И вы должны использовать это как

ArrayList<QuestionObject> questionObject = new ArrayList<QuestionObject>(); 
ArrayList<QuestionObject> answeredQuestion = new ArrayList<QuestionObject>(); 

Не забудьте заполнить questionObject с вашими параметрами Вопросы и aswers.

После этого ваша логика должна быть реализована. Вы можете взять идентификатор вопроса при отображении вопроса и удалить список. Может быть, вы можете нажать на удаленный вопрос еще один Arraylist.

//take the diplaying question this id can be your random number 
int id = questionObject.getId(); //or int id = yourRandomNumber; 
//store the another arraylist this question 
answeredQuestion.add(questionObject.get(id)); 
//remove it from list than never show again 
questionObject.remove(id); 

Я думаю, это может вам помочь.

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