Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab03-ready / project_solve / lab03 / src / avangard / demo / labs / lab03 / SolveLab03
.javapackage 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