2010-09-24 8 views
1

Je construis une application de sondage CLI en Java qui permet aux utilisateurs de répondre à des questions à choix multiples. S'il vous plaît dites-moi comment mon approche peut être améliorée.Quelle est la meilleure façon de sauvegarder les ensembles de réponses dans cette situation?

Chaque réponse à une question est enregistrée comme int, qui est l'indice de ce choix dans le tableau de choix pour cette question. Toutes les réponses à un sondage sont sauvegardées dans un tableau int. Je pense à sérialiser ce tableau int en utilisant ObjectOutputStream. Ensuite, lorsque j'ai besoin d'afficher les résultats, je vais restaurer le tableau et imprimer chaque élément après un onglet.

Le problème avec cette approche est (je crois) que le second ensemble de réponses écrase le premier. J'ai pensé à deux alternatives, qui ont toutes deux l'air mauvaises. L'un consiste à enregistrer chaque jeu de réponses dans un fichier distinct. Mais alors venez afficher l'heure, je vais devoir lire tous les fichiers à la fois pour garder les réponses à la même question ensemble. L'autre sauvegarde le tableau int sous la forme d'une ligne séparée par des tabulations dans un fichier de texte brut (de sorte que chaque ensemble de réponses crée une nouvelle ligne), puis de l'analyser par token et de l'analyser dans un tableau int pour l'afficher. Mais alors le code tokenizing/parsing est une horreur à lire (actuellement il ressemble à ceci):

EDIT: Oups, ce code n'est même pas correct. Mon point est juste que l'analyse est un gâchis, donc je cherche un moyen de ne pas avoir à analyser.

File savedResults = new File(Main.surveyResultsFolder, surveyFileName); 
try { 
    BufferedReader br = new BufferedReader(new FileReader(savedResults)); 
    int[] currentResponseSet = new int[noOfQuestions]; 
    String currentResponseString = ""; 
    String[] currentResponseStrArray = null; 
    while((currentResponseString = br.readLine()) != null) { 
     currentResponseStrArray = currentResponseString.split("\t"); 

    for (int i = 0; i < currentResponseStrArray.length; i++) { 
     currentResponseSet[i] = Integer.parseInt(currentResponseStrArray[i]); 
} 
    } 
    //then I'll print currentResponseSet here. 
    } 
catch (IOException ex) { 
    System.out.println("Error reading results file " + surveyFileName); 
} 

Je suis à court d'idées. Comme vous pouvez le voir, ma connaissance des techniques de traitement des données est limitée. N'importe quels preneurs?

Répondre

1

Plusieurs points:

  1. Sauvegarde des données à l'aide d'un ObjectOutputStream est généralement une mauvaise idée. L'enregistrement des données sous forme lisible par l'homme est un choix supérieur.
  2. Je ne comprends pas pourquoi vous pensez que la logique d'analyse que vous avez là-bas est une 'horreur' - bien sûr que vous pouvez nettoyer le code un peu, mais fondamentalement, cela semble correct.
  3. Avez-vous envisagé de stocker les données dans une base de données ... relationnelle ou non? Au lieu d'utiliser la position d'index de tableau pour lier une réponse à une question, j'utiliserais des ID de question. De cette façon, l'enquête peut évoluer avec le temps et vous aurez toujours des données semi-utilisables. À tout le moins, vous aurez une réponse partiellement complète. Si vous voulez une forme de persistance minimaliste pour une telle structure, une idée est de stocker {enregistrer, questionner, répondre} dans chaque ligne de texte. La lecture des données produirait Map<record, Map<question, answer>>. Vous pouvez trouver une construction 'automap' utile ici:
 
    public abstract class AutoMap<K extends Comparable, V> 
    extends TreeMap<K, V> { 
     protected abstract V createValue(); 

     public V getOrCreate(K key) { 
     V value = get(key); 
     if (value == null) { 
      value = createValue(); 
      put(key, value); 
     } 
     return value; 
     } 
    } 

    public class MapOfMaps<J extends Comparable, K extends Comparable, V> 
    extends AutoMap<J, Map<K, V>> { 
     protected Map<K, V> createValue() { 
     return new TreeMap<K, V>(); 
     } 
    } 
+0

Cela ressemble à une bonne solution! Si je suis appelé à améliorer le code ci-dessus, je serai sûr de l'utiliser :) –

3

La chose la plus évidente à faire est de l'enregistrer dans une base de données. Ensuite, le stockage et la récupération est très simple.

Si vous ne pouvez pas faire cela pour une raison quelconque, alors je pense que votre solution actuelle est la voie à suivre. Votre code d'analyse est assez simple pour moi. Je créerais une fonction séparée pour analyser une ligne qui renvoie le tableau de réponses pour une ligne, puis demander à l'appelant de faire tout ce qui doit être fait avec, juste pour une modularisation propre.

+0

Merci! La seule raison pour laquelle je n'utilise pas de DB est parce que je ne sais pas comment en utiliser un: "> –

+0

@Anita: Eh bien, c'est une bonne raison si vous cherchez une réponse rapide et à court terme. À plus long terme, je suggère d'apprendre à utiliser une base de données! Je ne sais pas ce que vous êtes en train d'organiser, mais vous pouvez obtenir MySQL ou Postgres gratuitement, et toute société d'hébergement que j'ai jamais utilisé offre au moins un de ces – Jay