2014-02-15 4 views
0

У меня есть HashMap, содержащие HashMap, и эта вторая HashMap содержит другой HashMap:заселить Вложенные HashMaps

public static final Map<String, Map<String, Map<String, Boolean>>> questionnaireData; 

Я хочу, чтобы мои HashMap быть static и final и содержит данные, так что я сделал следующее:

public static final Map<String, Map<String, Map<String, Boolean>>> questionnaireData; 
    static { 
     Map<String, Map<String, Map<String, Boolean>>> data = new HashMap<>(); 
     data.put(
      "Architecture des ordinateurs", 
      new HashMap<String, Map<String, Boolean>>() {{ 
       put(
        "1. La partie du processeur spécialisée pour les calculs est :", 
        new HashMap<String, Boolean>() {{ 
         put("L’unité mathématique", false); 
         put("Les Registres", false); 
         put("L’unité arithmétique et logiqueue et logique", true); 
         put("UCC", false); 
        }} 
       ); 
       put(
         "2. Dans un ordinateur, les données sont présentées par un signal électrique de la forme :", 
         new HashMap<String, Boolean>() {{ 
          put("Analogique", false); 
          put("Numérique", true); 
          put("Alphanumérique", false); 
          put("Alphabétique", false); 
         }} 
        ); 
       put(
         "3. Les différents éléments d’un ordinateur (mémoire, processeur, périphériques…) sont reliés entre eux par des:", 
         new HashMap<String, Boolean>() {{ 
          put("Fils/câbles", true); 
          put("Registres", false); 
          put("Cartes d’extensions", false); 
          put("Bus", false); 
         }} 
        ); 
      }} 
     ); 
     data.put(
       "Bureautique", 
       new HashMap<String, Map<String, Boolean>>() {{ 
        put(
         "1. Quelles sont les fonctions d’un logiciel de traitement de texte ?", 
         new HashMap<String, Boolean>() {{ 
          put("Mise en page d’un texte", true); 
          put("Compilation d’un texte", false); 
          put("Présentation d’un texte sous forme de diaporama ", false); 
          put("Edition d’un texte", true); 
         }} 
        ); 
        put(
          "2. Insérer des lignes supplémentaires dans un tableau Word :", 
          new HashMap<String, Boolean>() {{ 
           put("Cela n'est pas possible et il faut calculer dès le départ le nombre de lignes qui seront nécessaires.", false); 
           put("Peut se faire à n'importe quel moment en allant dans la dernière cellule du tableau et en appuyant sur la touche Espace.", false); 
           put("Peut se faire à n'importe quel moment en utilisant le menu Tableau - Insérer Lignes.", true); 
           put("Peut se faire à n'importe quel moment en allant dans la dernière cellule du tableau et en appuyant sur la touche Entrer.", false); 
          }} 
         ); 
        put(
          "3. Qu’est ce qu’une cellule :", 
          new HashMap<String, Boolean>() {{ 
           put("La cellule est une colonne.", false); 
           put("La cellule est une ligne.", false); 
           put("Aucune des deux réponses.", true); 
          }} 
         ); 
       }} 
      ); 
     questionnaireData = Collections.unmodifiableMap(data); 
    } 

Я слышал, что использование анонимного класса может создавать проблемы, но я не могу найти другого метода, кроме этого.

Фактически, существует метод, в котором я должен объявить и заполнить HashMap и использовать его в качестве аргумента для родителя HashMap, но в моем случае я получаю сотни объявлений.

Что вы думаете о моем коде? и если есть какой-то лучший метод, пожалуйста, дайте мне знать.

+3

Как насчет создания пользовательских классов как для вашей вопросника, так и для вопросов? Наличие так много встроенных карт просто сделает ваш код уродливым и утомительным для работы. – t0mppa

+0

Откуда эти данные? Все ли это статично? –

+1

Этот код ужасен; например, внутренние Карты по-прежнему могут быть изменены и добавлены или удалены дополнительные элементы (что, по-видимому, не является вашим намерением, и побеждает идею константы статического финала). Кроме того, обычно не рекомендуется использовать идиому «двойная привязка» (искать по сайту по причинам). Почему бы не создать подходящий (неизменный) класс для вашей проблемы с хранением данных? И затем инициализируйте с помощью некоторого файла config/properties. – qqilihq

ответ

1

Поскольку вы попросили пример, вот и мы.

Тема:

package com.answer.stack.overflow.questionnaire; 

import java.util.Set; 
import java.util.TreeSet; 

public class Topic { 
    private String title; 

    private Set<Question> questions = new TreeSet<Question>(); 

    public Topic(String title) { 
    this.title = title; 
    } 

    public String getTitle() { 
    return title; 
    } 

    public void addQuestion(Question question) { 
    questions.add(question); 
    } 

    public Set<Question> getQuestions() { 
    return questions; 
    } 

    @Override 
    public String toString() { 
    String text = "Topic is ... " + title + "\n"; 

    for (Question question : questions) { 
     text += question.toString() + "\n"; 
    } 

    return text; 
    } 
} 

Вопрос:

package com.answer.stack.overflow.questionnaire; 

public class Question implements Comparable<Question> { 
    private String text; 
    private String code; 

    private Answer correctAnswer; 

    public Question(String code, String text, String correctAnswerText) { 
    this.code = code; 
    this.text = text; 
    this.correctAnswer = new Answer(code, correctAnswerText); 
    } 

    public String getText() { 
    return text; 
    } 

    public String getCode() { 
    return code; 
    } 

    public boolean isCorrect(String answer) { 
    return correctAnswer.getText().equalsIgnoreCase(answer); 
    } 

    @Override 
    public int compareTo(Question o) { 
    return code.compareToIgnoreCase(o.code); 
    } 

    @Override 
    public String toString() { 
    return code + ": " + text + " (" + correctAnswer.getText() + ")"; 
    } 
} 

Ответ:

package com.answer.stack.overflow.questionnaire; 

public class Answer { 
    private String code; 
    private String text; 

    public Answer(String code, String text) { 
     this.code = code; 
     this.text = text; 
    } 

    public String getText() { 
     return text; 
    } 

    @Override 
    public String toString() { 
     return code + ": " + text; 
    } 
} 

Анкета:

package com.answer.stack.overflow.questionnaire; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Questionnaire { 
    private List<Topic> topics = new ArrayList<Topic>(); 

    public void addTopic(Topic topic) { 
    topics.add(topic); 
    } 

    public void checkAnswers(Map<String, String> answers) { 
    for (Topic topic : topics) { 
     for (Question question : topic.getQuestions()) { 
     String code = question.getCode(); 
     String answerText = answers.get(code); 

     if (answerText == null) { 
      System.out.println("Answer not provided for question " + code + "."); 
     } else if (!question.isCorrect(answerText)) { 
      System.out.println("\"" + answerText + "\" is an incorrect answer for question " + code + "."); 
     } else { 
      System.out.println("Question " + code + " was answered correctly!"); 
     } 
     } 
    } 
    } 

    @Override 
    public String toString() { 
    String text = ""; 

    for (Topic topic : topics) { 
     text += topic.toString() + "\n"; 
    } 

    return text; 
    } 

    public static void main(String[] args) { 
    Questionnaire questionnaire = new Questionnaire(); 
    Map<String, String> answers = new HashMap<String, String>(); 
    Topic topic = new Topic("My attributes"); 

    topic.addQuestion(new Question("1A", "What is my name?", "Anonymous")); 
    topic.addQuestion(new Question("1B", "How tall am I?", "190 cm")); 

    questionnaire.addTopic(topic); 

    topic = new Topic("Maths"); 

    topic.addQuestion(new Question("2A", "How much is 1+1?", "2")); 
    topic.addQuestion(new Question("2B", "How much is 3/0?", "Not a number")); 

    questionnaire.addTopic(topic); 

    System.out.println(questionnaire.toString()); 

    answers.put("1B", "190 cm"); 
    answers.put("2A", "2"); 
    answers.put("2B", "infinite?"); 

    questionnaire.checkAnswers(answers); 
    } 
} 

Выходные:

Топик ... Мои атрибуты
1А: Что такое мое имя? (Анонимный)
1B: Насколько высок я? (190 см)

Тема ... Математика
2A: Сколько стоит 1 + 1? (2)
2B: Сколько стоит 3/0? (Не число)

Ответ не предоставлен на вопрос 1A.
Вопрос 1B был дан правильно!
Вопрос 2A был дан правильно!
"бесконечно?" является неправильным ответом на вопрос 2B.

Обратите внимание, что вы должны прочитать все вопросы из файла, как qqilihq предложил, вместо жесткого кодирования их в вашу программу.

Также это не оптимизированная версия. Точка должна была просто продемонстрировать, как решить ту же проблему с пользовательскими классами. Вы можете взглянуть на шаблон посетителя, чтобы проверить ответы элегантным и простым способом и, например, подклассифицировать различные типы ответов.

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