W czym przechowywać dane gdy chcę stworzyć quiz.

0

Witajcie.
Chcę napisać sobie quiz w Javie, lecz nie wiem w czym przechowywać pytania i odpowiedzi.
Próbowałem z tablicą dwuwymiarową ([1][0] pytanie [1][1] odpowiedź itd), ale miałem z tym problem.
Z mapami też mam problem (klucz pytanie, parametr odpowiedź; przy tym powstaje jeszcze problem wyszukiwania pytań po numerze pytania).
Zamieszczę kod, który na razie wykorzystałem.
Chciałbym to jeszcze jakoś na klasy podzielić ale mam lekki problem z tym również, ale to drugorzędna sprawa.
http://pastebin.com/68nNSWL7

EDIT.
Dodam, że w pliku mam taki schemat:
pytanie1
odpowiedz1
pytanie2
odpowiedz2
itd...

0

Cześć,
najlepiej jakbyś sobie podpiął jakąś bazę SQL.

0

tzn skorzystał z Hibernate lub cos w tym stylu?

0

Raczej JDBC,Hibernate to overkill w tym przypadku/ Spring ma JDBCTemplate

0

albo w XMLu, JSONie, TXTku i co Ci tam do głowy jeszcze wpadnie.

Wg mnie w czym to zapiszesz nie ma kompletnie znaczenia z punktu widzenia architektury samej aplikacji. To w czym to będzie "na zewnątrz" ma się nijak do tego jak będziesz "wczytany" quiz przechowywał w aplikacji i jak ją podzielisz na klasy

0

patrzę sobie w ten kod...

buffor

Nie ma takiego słowa, ani po polsku (bufor), ani po angielsku (buffer)

Reszta zmiennych po polsku (linia, licznik) - też nie za bardzo wygląda.

Wczytywanie danych z pliku... Odkrywasz Amerykę na nowo w sumie tworząc własny format i pliku ręcznie go parsując i deserializując. Zwykle użycie jednego z uniwersalnych formatów typu JSON, YAML, XML, CSV, SQLite itp. itd. i użycie gotowej biblioteki jest lepszym wyjściem niż taka partyzantka.

1

Proponuję, żebyś trzymał same pytania w formacie json. Dlaczego? Poniewaz jest to jeden ze standardow. Drugim najpopularniejszym jest xml. Musisz tylko poszukac jak to sparsowac (google: parse json java) i zamienic kazde pytanie na obiekt klasy Question

{  
   "questions":[  
      {  
         "question":"Which material is most dense?",
         "answers":[  
            "Silver",
            "Styrofoam",
            "Butter",
            "Gold"
         ],
         "correct":3
      }
   ]
}

Już w samej aplikacji możesz utworzyć sobie taką strukturę (z samej Javy za dużo nie wiem, więc...)

class Question {
    private String body;
    private List<String> answers;
    private int correctAnswer;

    public Question(String body, List<String> answers, int correctAnswer) {
        this.body = body;
        this.answers = answers;
        this.correctAnswer = correctAnswer;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        char ch = 65;
        for (String answer : answers) {
            String formattedAnswer = ch++ + ") " + answer + "\n";
            sb.append(formattedAnswer);
        }

        return body + "\n" + sb;
    }
}

Przykład

public class App {
    public static void main(String[] args) {
        List<Question> questions = new ArrayList<>();

        List<String> answers = new ArrayList<>();

        answers.add("1");
        answers.add("2");
        answers.add("3");
        answers.add("4");

        Question question = new Question("Pytanie?", answers, 3);

        questions.add(question);

        questions.forEach(System.out::println);
    }
}
Pytanie?
A) 1
B) 2
C) 3
D) 4
0

@Promar i @Desu dobrze radzą. JSON to fajna opcja, ale niekoniecznie praktyczna przy dużej ilości pytań. DB wymaga odrobinę więcej pracy, ale to też bardzo interesująca i dająca spore możliwości ścieżka. Polecałbym np. embedded H2, ewentualnie SQLite.

0

Dzięki wszystkim za rady. Wiele przydatnych rad i wiedzy.
Jednak skorzystałem z jdbc. Baza danych to świetny pomysł i wiele się nauczyłem.
Nie wiem czy to nie za mały projekt na bazę ale jak dla mnie świetnie się sprawdza.

Aktualnie mam problem z indeksowaniem.
Jest ustawiona autoinkrementacja wartości ID.
Chciałbym, żeby po usunięciu jakiegoś rekordu albo następny rekord, który dodam wskakiwał na miejsce starego, albo żeby cała tabela przesuwała się o rekord do góry (jak to napisałem to chyba realniejsza wydaje się pierwsza opcja), chciałbym aby nie pozostawały luki w bazie danych, zaoszczędzi mi to czasu, gdy będę operował na id pytania.
Powinienem zdjąć autoinkrementacje i za pomocą pętli szukać wolnych miejsc w metodzie insertQandA?
Może jakiś inny pomysł?

https://github.com/Kilgharrah/Java/tree/master/Quiz_Java_Junior

0

Dla własnego zdrowia psychicznego radziłbym nie przejmować się lukami. W małym projekcie co prawda jest jeszcze szansa, że nad tym zaplanujesz... No ale ogólnie tak się nie robi ;) Napisz lepiej czemu właściwie te luki są dla Ciebie problemem?

0

@genobis: Wybierając konkretne pytanie np 15 z kolei, jego index może być w ogóle inny i będę musiał sprawdzać czy indeks pytania, które wybrałem nie będzie wynosił null. No ale dobra, zaradzimy.
Czy dobrym pomysłem jest takie coś, że jeśli będę miał chęć wybrać jakieś konkretne pytanie, to za pomocą pętli i licznika zliczę wartości, które nie są null i zatrzymam się na konkretnym pytaniu?

0

Nie wiem czy dobrze cię rozumiem, według mnie masz następujący problem:

Co zrobić jak chcę pytanie nr 15, a w bazie mam kolejne id 1,2,3, ..., 13, 14, 17.

Jeśli o to chodzi, to absolutnie nie usuwaj autoinkrementacji. id na bazie ma być unikatowe i służyć tylko do odnalezienia danego rekordu na podstawie id. Zazwyczaj nie przywiązujemy dużej wagi do konkretnego id, no chyba że mamy skrypt sqlowy który wstawi nam jeden konkretny wiersz o konkretnym, podanym przez nas id, to wtedy możemy się posługiwać tym id bo go znamy.

Jakie rozwiązanie? Do swojej encji dodaj pole

number

które będzie unique i dodatnie. I potem wyszukujesz w bazie z użyciem klauzuli WHERE

0

@Pinek: Dzięki pinek. W ogóle o tym nie pomyślałem. No i po kłopocie. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1