import java.sql.*; import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class QuestionManager { private String DBDriver; private String DBHost; private String DBUser; private String DBPassword; private ArrayList questions; private ArrayList final_questions; public QuestionManager(String DB_Driver, String DB_Host, String DB_User, String DB_Password){ DBDriver = DB_Driver; DBHost = DB_Host; DBUser = DB_User; DBPassword = DB_Password; questions = new ArrayList<>(); final_questions = new ArrayList<>(); refresh_questions(); } public void refresh_questions(){ Connection con = null; try { Class.forName(DBDriver); } catch (ClassNotFoundException exc) { System.out.println("Exception in QuestionManager constructor (driver)" + exc); } try { con = DriverManager.getConnection(DBHost, DBUser, DBPassword); Statement st = con.createStatement(); ResultSet quest = st.executeQuery("select * from questions"); while (quest.next()) { Question result = new Question(); result.id = quest.getInt(1); result.quest = quest.getString(2); for (int j = 3; j <= quest.getMetaData().getColumnCount(); j++) { if (result.answers.size() == j - 3) { result.answers.add(""); } result.answers.set(j - 3, quest.getString(j)); } result.correct = 0; questions.add(result); } //взяли и распарсили обычные вопросы st = con.createStatement(); quest = st.executeQuery("select * from final"); while (quest.next()) { Question result = new Question(); result.id = quest.getInt(1); result.quest = quest.getString(2); for (int j = 3; j <= quest.getMetaData().getColumnCount(); j++) { if (result.answers.size() == j - 3) { result.answers.add(""); } result.answers.set(j - 3, quest.getString(j)); } result.correct = 0; final_questions.add(result); } //взяли и распарсили финальные вопросы } catch(Exception exc){ System.out.println("Exception in QuestionManager constructor (connection)" + exc); } try { if (con != null) con.close(); } catch (SQLException exc) { System.out.println("Exception in QuestionManager close connection" + exc); } } public ArrayList get_questions(int number){ ArrayList result = new ArrayList<>(); while(number > 0){ ArrayList order = new ArrayList<>(); for (int j = 0; j < questions.size(); j++) { //order = [1,2,3..n] order.add(j); } long seed = System.nanoTime(); Collections.shuffle(order, new Random(seed)); //order теперь случайная перестановка for(int i = 0; i < Math.min(number, order.size()); i++){ result.add(shuffle_answers(questions.get(order.get(i)))); // заполнили result вопросами в порядке из order } order.clear(); number -= questions.size(); } return result; } public ArrayList get_final_questions(int number){ ArrayList result = new ArrayList<>(); while(number > 0){ ArrayList order = new ArrayList<>(); for (int j = 0; j < final_questions.size(); j++) { order.add(j); } long seed = System.nanoTime(); Collections.shuffle(order, new Random(seed)); for(int i = 0; i < Math.min(number, order.size()); i++){ result.add(shuffle_answers(final_questions.get(order.get(i)))); } order.clear(); number -= final_questions.size(); } return result; } public Question shuffle_answers(Question quest){ //перемешивание ответов в вопросе ArrayList order = new ArrayList(); for (int j = 0; j < quest.answers.size(); j++) { order.add(j); } long seed = System.nanoTime(); Collections.shuffle(order, new Random(seed)); Collections.shuffle(quest.answers, new Random(seed)); quest.correct = order.indexOf(quest.correct); order.clear(); return quest; } }