Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab03-ready / project_solve / lab03 / src / avangard / tools / MatrixUtils

.java
Скачиваний:
19
Добавлен:
18.03.2015
Размер:
9.19 Кб
Скачать
package avangard.tools;

import avangard.tools.checkers.CheckComment;
import avangard.tools.checkers.SingleCommentsCheckerImpl;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

/**
* Утилитарный класс работы с матрицами и векторами.
*/
public class MatrixUtils {

private MatrixUtils() {
}

/** Константное поле для хранения объекта проверки однострочных комментариев */
final public static CheckComment DEFAULT_CHECKER = new SingleCommentsCheckerImpl();

/**
* Прочитать из потока непустую строку (комментарии отбрасываются по логике checker)
* @param src
* @param checker
* @return
* @throws IOException
*/
public static String readNonEmptyLine(BufferedReader src, CheckComment checker) throws IOException {
if (checker == null) // используем значение по-умолчанию
checker = DEFAULT_CHECKER;

String data;
do {
data = src.readLine();
if (data == null)
throw new EOFException("Неожиданный конец файла");
data = checker.removeComment(data);
} while (data == null || data.trim().length() == 0);
return data;
}

/**
* Загрузка числовой матрицы с автоматическим пропуском комментариев в строках
* @param in входной поток
* @param rows кол-во строк в матрице
* @param cols кол-во столбцов в матрице
* @param checker объект, который будет проверять наличие комментариев.
* Если указать null, то будет использоваться по-умолчанию DEFAULT_CHECKER.
* @return прочитанная матрица размером (rows x cols)
* @throws IOException поднимается если встречен конец файла или были ошибки вв/выв
*/
public static List<List<Long>> readMatrix(BufferedReader in, int rows, int cols
, CheckComment checker
) throws IOException
{
final List<List<Long>> result = new ArrayList<List<Long>>(rows);
for(int i = 0; i < rows; i++) {
result.add( readVector(in, cols, checker));
}
return result;
}

public static List<List<Long>> readMatrix(BufferedReader in, int rows, int cols
) throws IOException {
return readMatrix(in, rows, cols, null);
}

/**
* Загрузка вектора чисел с автоматическим пропуском комментариев в строках
*
* @param src входной поток
* @param vecSize размер вектора
* @param checker объект, который будет проверять наличие комментариев.
* Если указать null, то будет использоваться по-умолчанию DEFAULT_CHECKER.
* @return прочитанный вектор, размером size
* @throws IOException поднимается если встречен конец файла или были ошибки
* вв/выв
*/
public static List<Long> readVector(BufferedReader src, int vecSize
, CheckComment checker)
throws IOException
{
final List<String> parts = readStrVector(src, vecSize, checker);
final List<Long> result = new ArrayList<Long>(vecSize);
for (String part : parts) {
result.add(Long.parseLong(part));
}
return result;
}

/**
* Функция чтения вектора указанного размера.
* Предполагается наличия всего вектора внутри одной строки потока.
* Функция проверки комментариев по умолчанию.
* @param src входной поток
* @param vecSize размер читаемого вектора, контролируется при чтении строки
* @return загруженный числовой вектор
* @throws IOException возникает при ошибках чтения потока
*/
public static List<Long> readVector(BufferedReader src, int vecSize) throws IOException {
return readVector(src, vecSize, null);
}

public static List<String> readStrVector(BufferedReader src, int vecSize
, CheckComment checker)
throws IOException
{
final String data = readNonEmptyLine(src, checker);

final String[] parts = data.trim().split("\\s+");
if (parts.length != vecSize) {
throw new RuntimeException(String.format("Ошибка при чтении файла \r\nНеверное кол-во чисел %s вместо %s:\r\n%s"
, parts.length, vecSize, ( checker == null ? data : checker.toString()) ));
}
final List<String> result = new ArrayList<String>();
for (String s : parts) {
result.add(s.trim());
}
return result;
// return Arrays.asList(parts);
}

public static List<String> readStrVector(BufferedReader src, int vecSize) throws IOException {
return readStrVector(src, vecSize, null);
}

/**
* Загрузка списка, который предполагается в виде
* на отдельной строке количество данных в последующих строках
* далее строки со списком (в указанном выше количестве).
* Комментарии во входном потоке обрабатываются фильтром checker.
* @param buf входной текстовый поток
* @param checker фильтр комментариев
* @return загруженный список или поднимается исключение о невеном кол-ве значений
* @throws IOException
*/
public static List<String> readList(BufferedReader buf, CheckComment checker)
throws IOException
{
final List<Long> listWithSize = readVector(buf, 1, checker);
final Long size = listWithSize.get(0);
final List<String> result = new ArrayList<String>();
for(int i=0; i < size; i++) {
final String s = readNonEmptyLine(buf, checker);
result.add(s.trim());
}
return result;
}

/**
* Формирование вектора в виде текстовой строки:
* vec[0] {tab}> vec[1] ...
* @param dest целевой буфер
* @param vec выводимый вектор
* @param title заголовок, если Null, то не печатается
* @return буфер dest
*/
public static StringBuilder printVector(final StringBuilder dest, final String title, final List<?> vec)
{
if (title != null && title.length() > 0) {
dest.append(title);
}
for (Object item : vec) {
dest.append(String.format("\t%5s", item));
}
return dest;
}

public static StringBuilder printVector(final StringBuilder dest, final List<?> vec) {
return printVector(dest, null, vec);
}

public static void printVector(final PrintStream out, final String title
, List<?> vec) throws IOException
{
final StringBuilder sb = printVector( new StringBuilder(), title, vec);
out.print(sb.toString());
}

/**
* Формирование матрицы в виде текста с данными по строкам в виде:
* {Заголовок}
* [1] ... данные первой строки по столбцам ...
* [2] ... данные второй строки по столбцам ...
* [nn] ... остальные строки ...
*
* @param dest целевой буфер
* @param M выводимая матрица
* @param title заголовок, если Null, то не печатается
* @return буфер dest
*/
public static StringBuilder printMatrix(final StringBuilder dest, final String title, final List<List<?>> M)
{
// выводим Заголовок, если он задан
if (title != null && title.trim().length() > 0) {
dest.append(title);
}

final int rows = M.size();
// final int cols = M[0].length;
for (int i = 0; i < rows; i++) {
// вывод в начале строки её номера (от единицы)
printVector(dest, String.format("[%s] ", i + 1), M.get(i));
dest.append("\n");
}
return dest;
}

/**
* Метод текстового вывода матрицы
*
* @param out поток для вывода
* @param M выводимая матрица
* @param title заголовок, если Null, то не печатается
* @throws IOException
*/
public static void printMatrix(final PrintStream out, final String title
, final List<List<?>> M
) throws IOException {
final StringBuilder sb = printMatrix( new StringBuilder(), title, M);
out.println(sb.toString());
}

}