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

jab4-answer / Job4_FilterComments / src / my / utils / MatrixUtils

.java
Скачиваний:
11
Добавлен:
18.03.2015
Размер:
8.14 Кб
Скачать
package my.utils;

import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.PrintStream;

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

private MatrixUtils() {
}

/**
* Публичный интерфейс для проверки комментариев.
*/
public interface CheckComment {
// void clear();

/**
* @param data
* @return true, если строка data содержит комментарий
*/
// этого метода не достаточно для отработки многострочных и частиных комментариев ...
// boolean isComment(String data);

/**
* Удалить комментарий из строки
* @param data строка с данными, в которой могут быть комментарии
* @return очищенную от комментариев строку data или null, если строка является комментарием.
*/
String removeComment(String data);
}

/** Константное поле для хранения объекта проверки однострочных комментариев */
final public static CheckComment DEFAULT_CHECKER = new CheckComment() {
@Override
public String removeComment(String data) {
/*
return ((data == null)
|| (data.trim().length() == 0)
|| (data.startsWith("#"))
|| (data.startsWith("//"))
) ? null : data;
*/
if ((data == null)
|| (data.trim().length() == 0)
|| (data.startsWith("#"))
|| (data.startsWith("//"))
)
return null;
return data;
}
};

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

public static int[][] 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 int[] readVector(BufferedReader src, int vecSize
, 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);

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, data));
}
final int[] result = new int[vecSize];
for (int i = 0; i < parts.length; i++) {
result[i] = Integer.parseInt(parts[i]);
}
return result;
}

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

/**
* Формирование вектора в виде текстовой строки:
* 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 int[] vec)
{
if (title != null && title.length() > 0) {
dest.append(title);
}
for (int i = 0; i < vec.length; i++) {
dest.append(String.format("\t%5d", vec[i]));
}
return dest;
}

public static StringBuilder printVector(final StringBuilder dest, final int[] vec) {
return printVector(dest, null, vec);
}

public static void printVector(final PrintStream out, final String title
, int[] 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 int[][] M)
{
// выводим Заголовок, если он задан
if (title != null && title.trim().length() > 0) {
dest.append(title);
}

final int rows = M.length;
// final int cols = M[0].length;
for (int i = 0; i < rows; i++) {
// вывод в начале строки её номера (от единицы)
printVector(dest, String.format("[%s] ", i + 1), M[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 int[][] M
) throws IOException {
final StringBuilder sb = printMatrix( new StringBuilder(), title, M);
out.println(sb.toString());
}

}