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

lab03-ready / project_solve / lab03 / src / avangard / demo / labs / lab03 / SolveLab03

.java
Скачиваний:
20
Добавлен:
18.03.2015
Размер:
9.33 Кб
Скачать
package avangard.demo.labs.lab03;

/**
Задание ( 4 балла + доп для вариантов усложнений).
	Во входном текстовом файле содержатся данные двух текстовых списков A и B, в виде
>>>
Целое n - кол-во элементов в списке A
элемент 1 списка A
...
элемент n списка A
Целое m - кол-во элементов в списке B
элемент 1 списка B
...
элемент m списка B
<<<
	Загрузить эти данные используя ArrayList или другие подходящие классы JCF. 
	Сравнить списки и вывести в выходной текстовый файл результат сравнения в виде таблицы:
	№	Элемент	Наличие в A		Наличие в B
	1	...		+/-			+/-
	2	...		+/-			+/-
	3	...		+/-			+/-
где в столбце "Элемент" перечисляются все элементы из объединения списков A и B
, а столбцах наличия выводится "+", если элемент присутствует в 
соответствующем списке и "-" иначе.

Усложнения, каждое из которых увеличивает Ваш общий бал на дополнительную величину:
1) (доп +1 балл) В некоторых строках входного файла могут содержаться комментарии, 
которые должны игнорироваться при чтении данных. Комментарием считается вся 
строка целиком или часть строки, начиная с символов '#', ';' или пары символов 
прямой слеш "//".
2) (доп  +1 балл) Выводимая таблица должна быть отсортирована по алфавиту.
3) (доп  +2 балла) Выводимые данные должны содержать исходные номера (не индексы) 
элементов в каждом списке.
4) (доп +3 балла) Коментарии могут быть многострочными. Такой комментарий 
начинается с пары символов "/ *" и заканчивается парой "* /". Причём, начало и
конец могут располагаться внутри строк, не обязательно в начале строки.


Например, для входного файла:
3 # первый список A содержит три элемента
Urals // у этого элемента индекс внутри A это [0], а номер [1]
Родина
Россия
2 // второй список B два
time
Urals

 */
import avangard.tools.MatrixUtils;
import avangard.tools.checkers.CheckComment;
import avangard.tools.checkers.MultiLineCommentsCheckerImpl;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

// DONE: вынести в отдельный класс утилит чтение-вывод матрицы и вектора ...
public class SolveLab03 {

	// static final String INPUT_FILENAME = "InputFile.txt";
	static final String INPUT_FILENAME = "lab3-in-file-with-multiline-comments.txt";
	static final String OUTPUT_FILENAME = INPUT_FILENAME+ ".out";

	private List<String> A, B;

	public static void main(String[] args) {
		try {
			final SolveLab03 lab = new SolveLab03();

			/** загрузка данных - пара списков вида строка счётчика + n непустых строк */
			lab.loadData(INPUT_FILENAME);

			/** в данном случае специально выделили метод обработки ... */
			{
				// очень просто формируем несортированный объединённый список - используем Set
				final Set<String> nodups = getUnsorted( lab.A, lab.B);

				lab.printLists( "несортированный объединённый список", nodups, lab.A, lab.B);

				// вывод сортированного обощего списка
				lab.printLists( "1-ый вариант сортированного объединённого списка", doCustomReorder(nodups), lab.A, lab.B);

				// вывод сразу отсортированного обощего списка
				lab.printLists( "2-ой вариант сортированного объединённого списка", getTreeSorted(lab.A, lab.B), lab.A, lab.B);
			}

		} catch(Throwable t) {
			t.printStackTrace( System.out);
		}
	}

	/**
	 * Метод чтения данных из файла
	 * @param fileName названия файла для чтения
	 * @throws IOException, FileNotFoundException
	 */
	private void loadData(final String fileName) throws IOException {
		final File loadingFile = new File(fileName);
		final BufferedReader buf = new BufferedReader( new FileReader( loadingFile.getAbsoluteFile()));
		try {
			final CheckComment checker = new MultiLineCommentsCheckerImpl();
			A = MatrixUtils.readList(buf, checker);
			B = MatrixUtils.readList(buf, checker);
		} finally {
			buf.close();
		}
	}

	/**
	 * Вывод списка total с пометками наличия в двух други списках
	 * @param total общий список
	 * @param A
	 * @param B
	 * @return 
	 */
	private StringBuilder printLists(String info, Collection<?> total, List<?> A, List<?> B) 
		throws FileNotFoundException
	{

		final StringBuilder result = new StringBuilder();

		if (info != null)
			result.append(info).append("\r\n");

		int i = 0;
		// без сортировки: for(String s: nodups)
		// с tree-сортировкой: for(String s: getTreeSorted(A, B))
		// с custom-сортировкой: for(String s: doCustomReorder(nodups))
		for(Object s: total)
		{
			i++;
			// номер и строка
			result.append(String.format("\t[%d]\t%-15s\t", i, "'"+ s+ "'"));

			addIndexInfo( result, s, A); // маркер вхождения в список A
			result.append('\t');         // разделитель
			addIndexInfo( result, s, B); // маркер вхождения в список A
			result.append("\n");
		}

		// выводим входные данные и результат на консольку ...
		System.out.println( result);
		// ... и в выходной поток
		(new PrintStream( (new File(OUTPUT_FILENAME)).getAbsolutePath()) ).println(result);
		return result;
	}

	/**
	 * Проверяет входит ли строка s в список List и формирует строку с минусом,
	 * если не входит или с плючом и позицией (от единицы) если входит.
	 * @param result
	 * @param s
	 * @param list 
	 */
	static void addIndexInfo(StringBuilder result, Object s, List<?> list) {
		final int pos = list.indexOf(s);
		result.append( (pos == -1) ? "-" : String.format( "+[%s]", pos+1));
	}

	static List<String> doCustomReorder(Collection<String> col) {
		final List<String> result = new ArrayList<String>(col);
		Collections.sort(result, new Comparator<String>(){
			@Override
			public int compare(String o1, String o2) {
				return (o1 == null) 
							? ((o2 == null) ? 0 : 1)
							: (o2 == null) ? -1 
							/**
							 * Чтобы при сравнении не учитывался регистр символов
							 * используем стандартную функцию
							 */
							: o1.compareToIgnoreCase(o2);
			}
		});
		return result;
	}

	/**
	 * Получить неупорядоченный объединённый список из уникальных элементов.
	 * @param A
	 * @param B
	 * @return 
	 */
	public static Set<String> getUnsorted(Collection<String> A, Collection<String> B) {
		final Set<String> nodups = new HashSet<String>();
		nodups.addAll(A);
		nodups.addAll(B);
		return nodups;
	}

	/**
	 * Получить упорядоченный объединённый список из уникальных элементов.
	 * С использованием TreeSet.
	 * @param A
	 * @param B
	 * @return 
	 */
	public static Set<String> getTreeSorted(Collection<String> A, Collection<String> B) {
		// Сортированный список, который будет содержать уникальные элементы 
		// из двух списков А и В:
		final SortedSet<String> result = new TreeSet<String>();
		result.addAll(A);
		result.addAll(B);
		return result;
	}

}
Соседние файлы в папке lab03