Приветствую!
Хочу поделиться с вами своим опытом по применению рекурсии и создании структур данных на ее основе. Думаю, прежде всего, эта статья будет интересна новичкам. Таким же как я :)Введение
Недавно я захотел создать для себя эдакий инструмент, который помогал бы мне (и вдруг еще кому-то)Продолжение
Задумка в плане структуры примерно такая (не в плане визуальности). Теперь о практической части. Алгоритм, код. Все написано своими словами, могу и ошибиться в академических трактовках :) Алгоритм создания "дерева": 1.создаю карту 2.добавляю в нее первый элемент, предварительно считав имя для этого первого элемента 3.спрашиваю о том, какие ветки у этого элемента 4.когда ветки кончаются (стоп-слово "no") перехожу к первому из вариантов и начинаю строить аналогичную структуру для этого элемента (пункты 1 - 3) 5.когда на последнем из элементов ставлю стоп-слово, тогда создание HashMap-ы заканчивается Затем я строю из имен узлов дерева строку с HTML тегами. Полученную строку вывожу в консоль.public class Main {
static String consoleEncoding = "UTF-8"; //для корректного вывода в консоль Linux и IDEA
// static String consoleEncoding = "Cp866"; //для корректного вывода в консоль Windows
public static void main (String[] args) throws Exception {
//создал основную карту
HashMap map = new HashMap<>();
//поместил в нее первый элемент
HashMap map0 = new HashMap<>();
PrintStream systemOut = System.out;
PrintStream printStream = new PrintStream(System.out, true, consoleEncoding);
System.setOut(printStream);
//начал заполнение с корня
System.out.println("Что хочешь расписать по частям, разобрать? Что хочешь сделать?");
Scanner scanner = new Scanner(System.in);
String answer1 = scanner.nextLine();
//поместил корень в основную карту
map.put(answer1, map0);
//поехали заполнять ветками (метод для работы "в ширину")
addBranchWithDialog(map0);
String toHTML = mapToHTML(map); // строка для HTML
System.out.println(toHTML);
System.setOut(systemOut);
printMap(map, 0); // вывод на консоль
scanner.close();
}
}
В HTML вывод получается примерно такой.
Количество вложенностей зависит только от фантазии :)
- ВРЕМЯ
- дни недели
- вторник
- среда
- пятница
- понедельник
- четверг
- воскресенье
- поработал - отдохни :)
- поработал - отдохни :)
- суббота
- вторник
- времена года
- осень
- весна
- лето
- зима
- осень
- время суток
- вечер
- день
- ночь
- утро
- вечер
- длинный текст
- Стандартно обычно пишут Lorem upsum. Но я так поступать не буду:) Тут будет просто длинная строка в которой не может быть энтеров, иначе перейдем к следующему элементу. Изначально не рассчитывалось на длинные строки и большие блоки
- Стандартно обычно пишут Lorem upsum. Но я так поступать не буду:) Тут будет просто длинная строка в которой не может быть энтеров, иначе перейдем к следующему элементу. Изначально не рассчитывалось на длинные строки и большие блоки
- дни недели
ВРЕМЯ
дни недели
вторник
среда
пятница
понедельник
четверг
воскресенье
поработал - отдохни :)
суббота
времена года
осень
весна
лето
зима
время суток
вечер
день
ночь
утро
длинный текст
Стандартно обычно пишут Lorem upsum. Но я так поступать не буду:) Тут будет просто длинная строка в которой не может быть энтеров, иначе перейдем к следующему элементу. Изначально не рассчитывалось на длинные строки и большие блоки
Методы
Метод addBranchWithDialog() начинает спрашивать имена подпунктов, и эти имена добавляет в ArrayList пока не будет стоп-слова "no" Затем по всем элементам списка по порядку начинает создавать ветки "вниз" messageRecurs() Метод по добавлению "вниз" сам в свою очередь сразу начинает использовать метод addBranchWithDialog(), который
/**
* static method to create branches in width. horizontal growth
* @param map where add new branches
* @throws IOException
*/
public static void addBranchWithDialog(HashMap map) throws IOException {
System.out.println("Что-то для этого надо сделать? Если надо то что? ");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, consoleEncoding));
String data = reader.readLine();
ArrayList answers = new ArrayList<>();
while (!"no".equalsIgnoreCase(data)) {
answers.add(data);
System.out.println("Что-то еще? ");
data = reader.readLine();
}
for (String answer: answers) {
map.put(answer, messageRecurs(answer));
}
}
/**
* static method for creating HashMap, where each of all elements has into yourself another map. Uses recursion
* increase in depth
* @return HashMap
* @throws IOException
*/
public static HashMap messageRecurs(String data) throws IOException {
HashMap hashMap = new HashMap<>();
System.out.println(data + "."); //чтобы видеть для какой ветки сейчас идет добавление веток в ширину
addBranchWithDialog(hashMap);
return hashMap;
}
Методы по выводу информации
/**
* print map structure to console using custom delimiter "delim"
* @param map to print
* @param n start from
*/
public static void printMap (HashMap map, int n) {
StringBuilder builder = new StringBuilder("");
String delim = " ";
for (int i = 0; i < n; i++) {
builder.append(delim);
}
String prefix = builder.toString();
String result = "";
for (Map.Entry pair : map.entrySet()) {
String key = pair.getKey();
result = prefix + key;
HashMap value = (HashMap) pair.getValue();
System.out.println(result);
printMap(value, n + 1);
}
}
/**
* method for adding HTML tags to map's elements
* in this case that is tag -
*
* now there's some problem with encoding in this method.
* need to create a html template for print out. to add "charset=utf-8"
* @param hashMap our main map
* @return String to view
*/
public static String mapToHTML(HashMap hashMap) {
StringBuilder builder = new StringBuilder();
builder.append("");
for (Map.Entry pair: hashMap.entrySet()) {
String key = pair.getKey();
HashMap value = (HashMap) pair.getValue();
builder.append("- ");
builder.append(key);
builder.append(mapToHTML(value));
builder.append("
");
}
builder.append("
");
return builder.toString();
}
Еще один пример строения карты:
- Хочу стать Java программистом
- Изучать дополнительные материалы
- делать свои проекты
- начать воплощать свои идеи в жизнь.
- широко открыть глаза и уши и смотреть в чем нуждаются люди (Так был создан Facebook)
- широко открыть глаза и уши и смотреть в чем нуждаются люди (Так был создан Facebook)
- начать воплощать свои идеи в жизнь.
- Хорошо учиться на JavaRush
- попасть на стажировку
- дойти до 30-го уровня и решить большинство задач
- More practice
- More practice
- решить тестовое задание
- сделать в срок
- сделать в срок
- купить подписку Intership + или Mentor+
- вложить денежку в свое обучение
- вложить денежку в свое обучение
- дойти до 30-го уровня и решить большинство задач
- Каждый день решать задачи
- выделить минимум час времени на изучение материала и решение задач
- Предупредить своих. чтобы не беспокоили
- зарядить наконец-то телефон
- Написать всем СМС-ки
- зарядить наконец-то телефон
- Предупредить своих. чтобы не беспокоили
- выделить минимум час времени на изучение материала и решение задач
- Если есть вопросы, то задавать их на портале помощи help.javarush.ru
- в вопросе писать условие задачи
- Зарегистрироваться на портале
- пользоваться поиском
- в вопросе писать условие задачи
- попасть на стажировку
- Изучать дополнительные материалы
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
А можно и мясом нарастить со временем:
— сделать узлы дерева любым объектом (текст, бинарные данные( например изображение или иконка), ссылка на внешний файл или URL....)
— сделать ссылки второго типа (не основные) между узлами, для указания возможных связей.
— при удалении узла, сделать возможность «мягкого» удаления, чтобы можно было восстановить при необходимости (а в обычном режиме данные ветки не учитываются).
и т.п.