Ola,
Codigo criado no processo de prototipagem de um sistema para e-learning dentro do grupos de estudos OSUM MetroCarioca.
Classe Quiz Random gerencia perguntas e perguntas respondidas;
package br.com.amsterdaintelligence.quizrandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
*
* @author amsterda
*/
public class QuizRandom {
private List<Pergunta> perguntas;
private List<Pergunta> perguntasRespondidas;
private Random randomGenerator;
//Inicia o Quiz com perguntas vindas da base de dados, colocadas em um List<Pergunta>
public QuizRandom(List<Pergunta> perguntas) {
this.perguntas = perguntas;
this.perguntasRespondidas = new ArrayList<Pergunta>();
this.randomGenerator = new Random();
}
public Pergunta pegaPergunta() {
// Pega uma pergunta aleatoriamente no vetor de perguntas;
Pergunta perguntaAuxiliar = this.perguntas.get(this.randomGenerator.nextInt(perguntas.size()));
//Se o vetor de perguntas já respondidas não contiver a pergunta pega randomicamente;
if (!perguntaJaRespondida(perguntaAuxiliar)) {
perguntasRespondidas.add(perguntaAuxiliar);
return perguntaAuxiliar;
}
return pegaPergunta();
}
public boolean perguntaJaRespondida(Pergunta perguntaAuxiliar) {
//Verifica se a pergunta já foi respondida
boolean perguntaJaRespondida = perguntasRespondidas.contains(perguntaAuxiliar);
return perguntaJaRespondida;
}
public List<Pergunta> getPerguntas() {
List<Pergunta> perguntasAuxiliar = new ArrayList<Pergunta>();
for (Pergunta pergunta : perguntas) {
perguntasAuxiliar.add(pergunta);
}
return perguntasAuxiliar;
}
}
Classe Pergunta:
package br.com.amsterdaintelligence.quizrandom;
/**
*
* @author amsterda
*/
public class Pergunta {
private String conteudoPergunta;
public Pergunta(String conteudoPergunta) {
this.conteudoPergunta = conteudoPergunta;
}
public String getConteudoPergunta() {
return conteudoPergunta;
}
public void setConteudoPergunta(String conteudoPergunta) {
this.conteudoPergunta = conteudoPergunta;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pergunta other = (Pergunta) obj;
if ((this.conteudoPergunta == null) ? (other.conteudoPergunta != null) : !this.conteudoPergunta.equals(other.conteudoPergunta)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 67 * hash + (this.conteudoPergunta != null ? this.conteudoPergunta.hashCode() : 0);
return hash;
}
@Override
public String toString() {
return new StringBuilder().append("\nPergunta: ").append(this.conteudoPergunta).toString();
}
}
Testes para classe QuizRandom no Netbeans com JUnit 4
package br.com.amsterdaintelligence.quizrandom;
import java.util.Arrays;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author amsterda
*/
public class QuizRandomTest {
public QuizRandomTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
// TODO add test methods here.
// The methods must be annotated with annotation @Test. For example:
//
// @Test
// public void hello() {}
@Test
public void testInicializaçãoDasPerguntas() {
Pergunta pergunta1 = new Pergunta("Pergunta teste1");
Pergunta pergunta2 = new Pergunta("Pergunta teste2");
QuizRandom qr = new QuizRandom(Arrays.asList(pergunta1, pergunta2));
assertEquals(pergunta1, qr.getPerguntas().get(0));
assertEquals(pergunta2, qr.getPerguntas().get(1));
}
@Test
public void testPerguntaJaRespondida() {
Pergunta pergunta1 = new Pergunta("Pergunta teste1");
Pergunta pergunta2 = new Pergunta("Pergunta teste2");
QuizRandom qr = new QuizRandom(Arrays.asList(pergunta1, pergunta2));
Pergunta perguntaRespondida = qr.pegaPergunta();
assertTrue(qr.perguntaJaRespondida(perguntaRespondida));
}
@Test
public void testPerguntaNaoFoiRespondida() {
Pergunta pergunta1 = new Pergunta("Pergunta teste1");
Pergunta pergunta2 = new Pergunta("Pergunta teste2");
QuizRandom qr = new QuizRandom(Arrays.asList(pergunta1, pergunta2));
Pergunta perguntaRespondida = qr.pegaPergunta();
if (perguntaRespondida.equals(pergunta1)) {
assertFalse(qr.perguntaJaRespondida(pergunta2));
} else {
assertFalse(qr.perguntaJaRespondida(pergunta1));
}
}
@Test
public void testPerguntaExibidaNaTelaDaFormaCorreta() {
Pergunta pergunta1 = new Pergunta("Pergunta teste1");
assertEquals(pergunta1.toString(), "\nPergunta: Pergunta teste1");
}
}
Nota que os numeros gerados tanto por Math.random(), como por new Random.nextInt() são pseudo-randomicos, ou seja, são baseados no clock e desta forma as sequencias tendem a se repetir e não parecerem realmente aleatorias.Contudo para diminuir a complexidade, não foi usado um algoritmo gerador de numeros randomicos especializado .
Espero ter ajudado!
[ ]'s