@KianGreenMoon

Как мне организовать вывод данных, имитирующию таблицу, ей не являясь(Не могу придумать как организовать перенос строки)?

Я тут туплю уже два дня гряду. Вот код:
int j = settings.getHeightPage();
        for(String[] person : sourceData.getPersonInfo())
        {
            //Названия колонн
            if(j == settings.getHeightPage())
            {
                System.out.println(head);
                j--;
            }

            //Разделитель
            System.out.println(new String(new char[settings.getWidthPage()]).replace("\0", "-"));

            //Output
            for(int i = 0; i < person.length; i++)
            {
                if(person[i].length() > settings.getWidth(i))
                {
                    person[i] = "Error" + new String(new char[settings.getWidth(i) - "Error".length()]).replace("\0", " ");
                }
                else
                    person[i] = person[i] + new String(new char[settings.getWidth(i) - person[i].length()]).replace("\0", " ");
            }
            System.out.println("| " + person[0] + " | " + person[1] + " | " + person[2] + " |");
            j--;

            //Разделение страниц
            if(j == 0 || person == sourceData.getPersonInfo().get(sourceData.getPersonInfo().size() - 1))
            {
                System.out.println("~");
                j = settings.getHeightPage();
            }
        }


Всё прекрасно, кроме if(person[i].length() > settings.getWidth(i)). Мне не надо писать Error, а мне нужно через чур длинную строку разбить на строки короче и вписывать в ту же яйчеку. Выход выглядит так:
| Номер    | Дата    | ФИО     |
--------------------------------
| 1        | 25/11       | Error     |
--------------------------------
| 2        | 26/11       | Error     |
--------------------------------
| 3        | 27/11       | Н/Д      |
--------------------------------
| 4        | 28/11   | Error        |
--------------------------------
| 5        | Error   | Error   |
~


А должен так:
| Номер    | Дата    | ФИО     |
--------------------------------
| 1        | 25/11   | Иван         |
|           |              | Иванович |


Всё усугубляется тем, что мне надо будет сделать вывод в файл под определённой кодировкой, поэтому я (может зря, объясните, если так) отсеял вариант использовать библиотеку для таблиц.
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@Karpion
1) Мне непонятно, откуда берётся ширина каждого столбца. Она известна и жёстко задана до печати таблицы? Или она вычисляется по содержимому таблицы (как в HTML), и тогда её можно узнать только после просмотра всего отчёта (т.е. печать отчёта - двухпроходная)?

2) Возможно ли, что имя/отчество/фамилия не влезет в столбец? Т.е. возможно ли, что столбец "ФИО" будет три символа? Что тогда делать?

3) Решение наверняка есть в текстовых браузерах - lynx, links и им подобных.
Ну и в Perl среди модулей наверняка есть библиотеки для генерации отчётов с Вашими требованиями.

4) Печать каждой строчки отчёта - это печать нескольких строк текста (в таблице " А должен так:" - две строки текста на первую строку отчёта).
Допустим, на первый вопрос - ответ "мы знаем ширину столбцов". Тогда алгоритм примерно такой:
* Создаём массив строк: "1", "25/11", "Иван Иванович".
* Тут у нас находится метка loop - для организации цикла. Конечно же, реально цикл мы сделаем на нормальных операторах, как учил Никлаус Вирт.
* Проходим по массиву, пытаемся напечатать содержимое. Первые две строки удалось напечатать полностью, они влезли - поэтому их обнуляем.
* А вот третья строка не влезла. Печатаем то, что влезло - т.е. "Иван". То, что напечатали - выбрасываем из строки (или, если в Си - играем поинтерами, чтобы не копировать содержимое строк).
* Да, кстати, выше мы не обнуляем влезшие строки, а точно так же выбрасываем то, что напечатали. Но т.к. влезло всё - то такИ обнуляем.
* По ходу дела записываем в целую переменную - остались ли непустые строки.
* После первого прохода у нас осталось: "", "", "Иванович" (т.е. в данном случае - да, непустые строки остались). Повторяем операцию (goto loop).

Я думаю, Вам д.б. понятно.

Upd: Критерий переноса - я за Вас придумать не могу. А в Вашем вопросе про это нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@KianGreenMoon Автор вопроса
int j = settings.getHeightPage();
        for(String[] person : sourceData.getPersonInfo())
        {
            //Названия колонн
            if(j == settings.getHeightPage())
            {
                System.out.println(head);
                j--;
            }

            //Разделитель
            System.out.println(new String(new char[settings.getWidthPage()]).replace("\0", "-"));

            //Вывод
            for(int i = 0; i < person.length; i++)
            {
                splitedText[i] = splitString(person[i],settings.getWidth(i));
            }
            while(splitedText[1].size() != splitedText[2].size())
            {
                if(splitedText[1].size() > splitedText[2].size())
                {
                    splitedText[2].add("");
                }
                else{
                    splitedText[1].add("");
                }
            }
            while(splitedText[0].size() != splitedText[1].size())
            {
                if(splitedText[0].size() > splitedText[1].size())
                {
                    splitedText[1].add("");
                }
                else{
                    splitedText[0].add("");
                }
            }
            for(int i = 0; i < splitedText[1].size(); i++)
            {
                splitedText[0].set(i, splitedText[0].get(i) + new String(new char[settings.getWidth(0) - splitedText[0].get(i).length()]).replace("\0", " "));
                splitedText[1].set(i, splitedText[1].get(i) + new String(new char[settings.getWidth(1) - splitedText[1].get(i).length()]).replace("\0", " "));
                splitedText[2].set(i, splitedText[2].get(i) + new String(new char[settings.getWidth(2) - splitedText[2].get(i).length()]).replace("\0", " "));
                System.out.println("| " + splitedText[0].get(i) + " | " + splitedText[1].get(i) + " | " + splitedText[2].get(i) + " |");
                j--;
            }

            //Разделение страниц
            if(j <= 0 || person == sourceData.getPersonInfo().get(sourceData.getPersonInfo().size() - 1))
            {
                System.out.println("~");
                j = settings.getHeightPage();
            }
        }


Мне стыдно это показывать. Костыль на костыле, и то работает не так, как надо, хотя и работает :D Чёрт, я устал, пойду поем :3 Если кто-то всё-таки сможет что подсказать - буду благодарен. Доброго времени суток
Ответ написан
Комментировать
EugeneP2
@EugeneP2
Java Dev
Для форматированного вывода в консоль, например в виде таблицы, есть готовый метод System.out.printf(...). Потратьте немного времени на изучение документации и не изобретайте велосипеды + гугл выдает кучу примеров, например

https://c4code.wordpress.com/2014/03/17/how-to-pri...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
25 апр. 2024, в 16:12
2000 руб./за проект
25 апр. 2024, в 16:08
130000 руб./за проект