/
YuriSoul
/
MyJavaLibs
Обзор
Документация
Войти
/
YuriSoul
/
MyJavaLibs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
MyLibs/src/consolGUI/TableViewer.java
221 строка
11 KB
YuriSoul
Классы MsgConstructor, MsgWiewer, подпакета msgProces и класс
09 ноя 2025, 20:36
09 ноя 2025, 20:36
a0d85fb
Код
Авторство
О чём код?
package consolGUI; import java.util.ArrayList; import java.util.Arrays; //КЛАСС ОТВЕЧАЮЩИЙ ЗА ВИЗУАЛИЗАЦИЮ ТЕКСТОВЫХ ДАННЫХ В ВИДЕ ТАБЛИЦЫ public class TableViewer { //ИСХОДНЫЕ ДАННЫЕ ДЛЯ ПОСТРОЕНИЯ ТАБЛИЦЫ И ЕЁ ВИЗУАЛИЗАЦИИ //ХРАНИЛИЩЕ ЗАПИСЕЙ (СТРОК) таблицы private ArrayList<ArrayList<String>> records = new ArrayList<ArrayList<String>>(); //ВНЕШНИЙ ВИД ГРАНИЦ (сетки) таблицы private final String BORDER_START_OF_RECORD = "| "; //граница начала записи (строки) private final String BORDER_BETWEEN_RECORD_CELLS = " | "; //граница между ячейками внутри записи (строки) private final String BORDER_END_OF_RECORD = " |"; //граница конца записи (строки) private final String UP_AND_LOW_BORDER_RECORD = "-"; //верхняя (нижняя) граница между записями (строками) private final String ADD_SYMBOLS_FIELD = " "; //дополнительные символы ячейки //ИСХОДНЫЕ ПАРАМЕТРЫ ТАБЛИЦЫ private int numOfRecords; //КОЛИЧЕСТВО ЗАПИСЕЙ (строк) таблицы private int numOfFields; //ДЛИНА ВХОДНОЙ ЗАПИСИ (КОЛИЧЕСТВО ПОЛЕЙ, СТОЛБЦОВ) таблицы //РАСЧЕТНЫЕ ПАРАМЕТРЫ ТАБЛИЦЫ //ХРАНИЛИЩЕ ЗНАЧЕНИЙ МАКСИМАЛЬНОЙ ШИРИНЫ ПОЛЕЙ по каждому из столбцов //необходимы для выравнивания всех ячеек столбца (поля таблицы) оп наибольшему значению символов в столбце private ArrayList<Integer> maxValuesWidthFieldCol = new ArrayList<Integer>(); //МАКСИМАЛЬНАЯ ДЛИНА ЗАПИСИ В ТАБЛИЦЕ (расчитывается исходя из максимальных ширин полей всех столбцов) //необходима для расчета полной ширины таблицы private int sumMaxValuesWidthFieldCol; //СУММА МАКСИМАЛЬНЫХ ЗНАЧЕНИЙ ШИРИНЫ ПОЛЕЙ (столбцов) (ПОЛНАЯ ШИРИНА ТАБЛИЦЫ) private int widthUpAndLowBorderRecord; //ШИРИНА ВЕРХНЕЙ (НИЖНЕЙ) ГРАНИЦЫ ЗАПИСИ (строки) таблицы //ВХОДНЫЕ ДАННЫЕ для построения таблицы public TableViewer(ArrayList<ArrayList<String>> records) { this.records = records; //ПОЛУЧАЕМ массив записей (строк) таблицы numOfRecords = records.size(); //ПОЛУЧАЕМ количество записей (строк) таблицы numOfFields = records.get(0).size(); //ПОЛУЧАЕМ длину входной записи (КОЛИЧЕСТВО ПОЛЕЙ ТАБЛИЦЫ) calcMaxWidthOfFieldColl(); //ВЫЧИСЛЯЕМ МАКСИМАЛЬНУЮ ШИРИНУ ПОЛЯ для каждого столбца таблицы (заносим в массив) calcSumMaxValuesWidthFieldCol(); //ВЫЧИСЛЯЕМ СУММУ МАКСИМАЛЬНОЙ ДЛИНЫ ЗАПИСИ таблицы (по всем полям) calcWidthUpAndLowBorderRecord(); //ВЫЧИСЛЯЕМ ШИРИНУ ВЕРХНЕЙ (НИЖНЕЙ) ГРАНИЦЫ ЗАПИСИ (строки) таблицы } //ПОКАЗАТЬ ЗАПИСИ таблицы public void showInputRecordsTab() { for (ArrayList<String> record : records) { for (String string : record) { System.out.print(string + " "); } System.out.println(); } } //ПОКАЗАТЬ количество записей (строк) таблицы public void showNumOfRecords() { System.out.println("Количество записей (строк) в таблице = " + numOfRecords); } //ПОКАЗАТЬ количество полей таблицы public void showNumOfFields() { System.out.println("Количество полей (столбцов) в таблице = " + numOfFields); } //РАСЧЕТ ПАРАМЕТРОВ ТАБЛИЦЫ //РАСЧЕТ ШИРИНЫ ВЕРХНЕЙ (НИЖНЕЙ) ГРАНИЦЫ ЗАПИСИ (строки) таблицы /* * numOfFields - количество полей входной записи (строки) таблицы * 4 - (2+2) количество символов для печать границ в начале и * в конце записи (строки) * (numOfFields - 1) * 3 - количество символов необходимое * для печать границ между полями записи таблицы * getMaxLengthRowOfTab() - // */ private void calcWidthUpAndLowBorderRecord() { widthUpAndLowBorderRecord = 4 + ((numOfFields - 1) * 3) + sumMaxValuesWidthFieldCol; } //РАСЧЕТ МАКСИМАЛЬНОЙ ШИРИНЫ ПОЛЯ для каждого столбца таблицы //вычисление максимального значения ячейки из всей таблицы private void calcMaxWidthOfFieldColl() { //массив для хранения текущей обрабатываемой записи (строки) ArrayList<String> record = new ArrayList<String>(); int maxWidthOfFieldColl = 0; //задаем начальную максимальную ширину поля столбца /* * внешний цикл идет по полям (столбцам) таблицы * внутренний цикл идет по записям и обрабатывает соответствующее поле (столбец) таблицы */ for (int i = 0; i < numOfFields; i++) { for(int j = 0; j < numOfRecords; j++) { record = records.get(j); //если ширина текущего поля (столбца) записи > максимальной ширины поля столбца записи if(record.get(i).length() > maxWidthOfFieldColl) { //от максимальной ширине поля (столбца) //присваивается текущая ширина поля записи maxWidthOfFieldColl = record.get(i).length(); } } //записываем очередную максимальную отобранную по столбцу ширину поля в массив maxValuesWidthFieldCol.add(maxWidthOfFieldColl); maxWidthOfFieldColl = 0; //обнуляем текущую максимальную ширину поля } } //РАСЧЕТ СУММЫ МАКСИМАЛЬНОЙ ДЛИНЫ ЗАПИСИ таблицы (по всем полям) private void calcSumMaxValuesWidthFieldCol() { for (Integer maxValue : maxValuesWidthFieldCol) { sumMaxValuesWidthFieldCol = sumMaxValuesWidthFieldCol + maxValue; } } //ДОСТУП К ПАРАМЕТРАМ И РАСЧЕТНЫМ ДАННЫМ ТАБЛИЦЫ //ПОЛУЧИТЬ ГРАНИЦУ НАЧАЛА ЗАПИСИ (строки) private String getBorderStartOfRecord() { return BORDER_START_OF_RECORD; } //ПОЛУЧИТЬ ГРАНИЦУ КОНЦА ЗАПИСИ (строки) private String getBorderEndOfRecord() { return BORDER_END_OF_RECORD; } //ПОЛУЧИТЬ ГРАНИЦУ МЕЖДУ ЯЧЕЙКАМИ ЗАПИСИ (строки) private String getBorderBetweenRecordCells() { return BORDER_BETWEEN_RECORD_CELLS; } //ПОЛУЧИТЬ ВЕРХНЮЮ (НИЖНЮЮ) ГРАНИЦУ ЗАПИСИ таблицы private String getUpAndLowBorderRecord() { return UP_AND_LOW_BORDER_RECORD; } //ПОКАЗАТЬ сетку таблицы таблицы с данными public void showTab() { int firstRecord = 0; int startIndex = 0; // int endIndex = numOfFields-1; int numSpaces = 0; for (ArrayList<String> record : records) { if(firstRecord == 0) { showUpAndLowBorderRecord(); //печать верхней границы записи (строки) System.out.println(); } for (String dataCellField : record) { for (int i = startIndex; i < maxValuesWidthFieldCol.size() - (maxValuesWidthFieldCol.size() - (startIndex+1)); i++) { numSpaces = maxValuesWidthFieldCol.get(i) - dataCellField.length(); } if (startIndex == 0) { System.out.print(getBorderStartOfRecord() + dataCellField + showAddCellSymbols(numSpaces)); } else if (startIndex == endIndex) { System.out.print(getBorderBetweenRecordCells() + dataCellField + showAddCellSymbols(numSpaces) + getBorderEndOfRecord()); } else { System.out.print(getBorderBetweenRecordCells() + dataCellField + showAddCellSymbols(numSpaces)); } startIndex++; } startIndex = 0; firstRecord++; System.out.println(); showUpAndLowBorderRecord(); //печать нижней границы записи (строки) System.out.println(); } } //ДОБАВИТЬ дополнительные символы в ячейку строки public String showAddCellSymbols(int numAddSymbols) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < numAddSymbols; i++) { sb.append(ADD_SYMBOLS_FIELD); } String result = sb.toString(); return result; } //ПОКАЗАТЬ верхнюю (нижнюю) границы строки public void showUpAndLowBorderRecord() { for (int i = 0; i < widthUpAndLowBorderRecord; i++) { System.out.print(getUpAndLowBorderRecord()); } } //ТЕСТИРОВАНИЕ public static void main(String[] args) { //МАССИВ ИСХОДНЫХ ДАННЫХ (ЗАПИСЕЙ) ТАБЛИЦЫ ArrayList<ArrayList<String>> records = new ArrayList<ArrayList<String>>(); //ИСХОДНЫЕ ЗАПИСИ ТАБЛИЦЫ ArrayList<String> record_1 = new ArrayList<String>(Arrays.asList("Строка_0_0", "Строка_0_1***********", "Строка_0_2", "Строка_0_3")); ArrayList<String> record_2 = new ArrayList<String>(Arrays.asList("Строка_1_0", "Строка_1_1", "Строка_1_2", "Строка_1_3")); ArrayList<String> record_3 = new ArrayList<String>(Arrays.asList("Строка_1_0", "Строка_1_1", "Строка_1_2", "Строка_1_3")); //ДОБАВЛЯЕМ ИСХОДНЫЕ ДАННЫЕ (ЗАПИСИ) в таблицу records.add(record_1); records.add(record_2); records.add(record_3); //СОЗДАЕМ МАССИВ ИСХОДНЫХ данных (ЗАПИСЕЙ ТАБЛИЦЫ) TableViewer tab = new TableViewer(records); //СОЗДАЕМ ОБЪЕКТ ТАБЛИЦУ и передаем в неё (ЗАПИСИ) данные таблицы в виде двумерного ArrayList tab.showTab(); //ПОКАЗАТЬ ИСХОДНЫЕ ЗАПИСИ таблицы с границами //tab.showInputRecordsTab(); System.out.println(); tab.showNumOfRecords(); //ПОКАЗАТЬ КОЛИЧЕСТВО ЗАПИСЕЙ таблицы tab.showNumOfFields(); //ПОКАЗАТЬ КОЛИЧЕСТВО ПОЛЕЙ таблицы } }