collections2012
.docTask 1
Create the package named by.gsu.epamlab for entities classes. Define the class PurchasesList for the collection of objects of two types (see topic inheritance, task 1):
– superclass, describing the commodity purchase Purchase,
– subclass for the purchase with a price discount PriceDiscountPurchase.
The file of csv format represents a series of text lines. Every line contains a set of values separated by a semicolon and corresponds to a single object of a superclass or a subclass depending on values number in the line. Lines with erroneous contents must be skipped.
All file names in the program should be used without csv–extension and package name (to add by default).
Constructors:
-
default constructor for empty collection creation,
-
constructor with the parameter – csv–filename, loading elements into the collection from a csv–file. To return an empty collection if some problem with a csv–file processing exists.
Necessary class field is collection itself. Other fields must be included into the class after the runner analysis.
Realize following operation under collection, i.e. a class field:
-
inserting purchase into the collection at the index position; if the index value is wrong the object should be inserted at the end of the collection;
-
deleting single element by it’s index;
-
calculating the total cost of all purchases;
-
printing collection in the table form and the total cost of all purchases;
-
sorting the collection by a given criterium using the method sort( ) of the class Collections;
-
searching an element in the collection by the same criterium using the method binarySearch( ) of the class Collections.
Sorting criterium:
1. compare on the String field increasing;
2. if two string values are equal then superclass object is less than a subclass one;
3. if objects belong to the same class then on the purchase cost increasing.
Realize two versions of the criterium:
1. do not use the reflection in the comparator class, i.e. use instanceof operation;
2. use the reflection, calling the method getClass() from compared objects.
Define the Runner class in the default package. The method main( ) should receive two arguments from the command line:
-
the first one is the name of main file in csv format;
-
the second one is the name of additional file in csv format.
The main file can contain wrong strings you should skip.
The additional file is considered to be correct and contains exactly 5 lines.
The algorithm of the method main( ):
-
create an object of the developed class, loading collection’s elements from the main file;
-
print the collection;
-
create another object of developed class, loading collection’s elements from the additional file;
-
insert the last element of the second collection at the position 0 of the first collection;
-
insert the initial element of the second collection at the position 1000 of the first collection;
-
insert the element with index 2 of the second collection at the position 2 of the first collection;
-
try to delete elements with indices 3, 10 and –5;
-
print the first collection;
-
sort the first collection;
-
print the first collection;
-
find the element with index 1 and the element with index 3 of the second collection in the first collection and print obtained results.
The example of the command line arguments: in addon
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The example of the file in.csv: bread;1550;1;20 candy;-1000;2 candy;-1000;-2 milk;1310;2 bread;1540;3 candy ;1000;2 candy;1000;2;5000 water;150;4;0.1;cold bread;1450;5 ;; potato;1800;2;100 butter;3700;1 water;ok;4 water;700;4;0.5 water;700.5;1 butter;3410;1;10 meat;18000;2;800
|
The example of the file addon.csv: choco;7200;2;200 choco;14000;1 meat;21250;2;50 choco;7300;2;300 potato;1750;2;50 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Output: Error-lines with problems declaration after creation
before sorting
after sorting
search results: element choco;14000;1 is not found
element choco;7300;2;300 is found at position 5
|
Замечания к задаче 1
– Информационные классы покупок разрешается редактировать.
– Если класс реализует интерфейс, то объявлять ссылку на интерфейс, а не на класс.
Например, класс ArrayList<T> реализует интерфейс List<T>. Тогда корректно:
public class MaterialsList {
List<Material> materials;
MaterialsList() {
materials = new ArrayList<Material>();
}
...
}
Примеры дисквалифицирующего кода:
ArrayList<Material> materials;
ArrayList<Material> materials = new ArrayList<Material>();
HashMap<Integer, String> users;
public ArrayList<Material> getMaterials() {…}
– Для вывода вектора в табличном виде использовать метод printf( ) потока System.out, а еще лучше создать отформатированную строку для вывода методом format( ) класса Formatter, см. И. Блинов, стр. 167.
– Magic numbers (см. И. Блинов, стр. 136; а также по ссылке http://skipy.ru/philosophy/constantsUsage.html) – это огромный минус качества кода. Заменять константами или перечислениями.
– Сортировку коллекции и поиск элементов в ней реализовать с помощью вызова соответствующих статических методов класса Collections: sort( ), binarySearch( ). Одним из аргументов методов должна являться ссылка на компаратор, соответствующий указанному в условии критерию.
– В компараторе учесть, что результат операции subclassInstance instanceof Superclass всегда true!
Например, purchase instanceof Purchase будет true, если purchase – ссылка на объект класса PriceDiscountPurchase.
Во втором варианте, если объекты принадлежат разным классам, то независимо от наличия отношения наследования между ними выражение purchase1.getClass( ) == purchase2.getClass( ) всегда ложно (причем можно использовать операцию ==, см. в Б. Эккель, гл. 12, пункт «instanceof против эквивалентности объектов Class»).
– Проверить работу раннера на «крайних» тестах: 1) файл in.csv отсутствует; 2) файл in.csv пустой; 3) все строки этого файла «неправильные».
Каждый тест прогонять на двух версиях компаратора.
Создать пакет с именем by.gsu.epamlab для субъектов классов. Определить класс PurchasesList для сбора объектов двух типов (см. тему наследства, задача 1): - Суперкласс, описывающих Покупка товаров покупки, - Подкласс для покупки с ценой скидка PriceDiscountPurchase. Файл формата CSV представляет собой ряд строк текста. Каждая строка содержит набор значений, разделенных точкой с запятой и соответствует одному объекту суперкласса или подкласса в зависимости от значений числа в строку. Линии с ошибочным содержание должно быть пропущено. Все имена файлов в программе должна быть использована без CSV-расширение и имя пакета (добавить по умолчанию). Конструкторы: конструктор по умолчанию для пустых создания коллекции, конструктор с параметром - CSV-файла, загрузки элементов в коллекции из CSV-файла. Чтобы вернуть пустую коллекцию, если некоторые проблемы с CSV-файл обработки существует. Необходимые поля класса самой коллекции. Остальные поля должны быть включены в класс после того, как бегун анализа. Поймите, следующие операции по сбору, то есть поле класса: приобретение вставки в коллекцию по позиции индекса, если значение индекса не так объект должен быть вставлен в конце сбора-ния; удаление одного элемента по его индексу; расчет общей стоимости всех покупок; печать коллекции в виде таблицы, а общая стоимость всех покупок; сортировки коллекции, данный критерий методом сортировки () класса коллекций; поиск элемента в коллекции того же критерия методом BinarySearch () класса коллекции. Сортировка критерия: 1. сравнить по строке увеличении поля; 2. если два значения строки равны, то суперкласс объекта меньше, чем подкласс одного; 3. если объекты принадлежат к одному классу, то по стоимости покупки растет. Реализовать два варианта критерия: 1. Не используйте свое отражение в компаратора класса, т. е. использовать InstanceOf эксплуатации; 2. использовать отражение, вызвав метод GetClass () из сравниваемых объектов. Определить Runner класса в пакет по умолчанию. Метод Main () следует пересмотреть ceive два аргумента из командной строки: Во-первых, это имя главного файла в формате CSV; второй это имя дополнительного файла в формате CSV. Основной файл может содержать неправильный строк вы должны пропустить. Дополнительный файл считается правильным и содержит ровно 5 строк. Алгоритм метода Main (): создать объект класса развитых, загрузка элементов коллекции от основного файла; печать коллекции; создать еще один объект развитых класса, загрузка элементов коллекции из дополнительных файлов; вставить последний элемент второй сбор в положение 0 первой коллекции; вставить исходный элемент второй сбор в позиции 1000 первую коллекцию, вставить элемент с индексом 2 второй сбор в положение 2 первой коллекции; попытаться удалить элементы с номерами 3, 10 и -5; печати первый сборник; сортировать первой коллекции; печати первый сборник; найти элемент с индексом 1, а элемент с индексом 3 второй сбор в первом сборе и печати полученных результатов.
Task 2
Let the file in.txt contains correct coordinates of segments (one per line) in the format:
(x1;y1) (x2;y2)
1) Create the list of kind (len; num) where len is the segment length rounded to integer and num is the number of segments of the length len.
2) Sort the list by the field num in descending order.
The example of the file in.txt: (0. ; 0) ( 2.5; 0.0) ( 0;0.99953) ( 0; 2 ) (-3.0f; 20.1e-1) (-2;2)
|
Output: 1;2 3;1
|
Замечания к задаче 2
– Данный тест предназначен исключительно для пояснения условия. Для проверки правильности работы решения требуется гораздо больше тестов.
– Названия классов должны точно отражать назначение и не совпадать с названиями классов из JDK. Например, Vector, Collection.
– Разрешается использовать коллекции, реализующие любой интерфейс, производный от Collection. Например, ArrayList, TreeSet. Следствие: запрещены хэш–таблицы, т.е. классы, реализующие интерфейс Map.
– Информационный класс, как обычно, должен быть в пакете. Считывание файла и необходимые действия реализовать в Runner классе.
– Строку разобрать методом split( ) через регулярное выражение. Формат строки (неформально):
\s*(\s*вещ.число\s*;\s*вещ.число\s*)\s*(\s*вещ.число\s*;\s*вещ.число\s*)\s*
Вещественное число во входной строке правильное. Пары скобок и точка с запятой между числами гарантированно имеются. Учитывать данные условия при составлении регулярного выражения. Не нужно подбирать выражение под вещественное число. Оно далеко не тривиальное.
– Для поиска элемента в коллекции использовать метод binarySearch( ) класса Collections. Цикл с линейным поиском элемента запрещается, т.к. очень неэффективный.
– Длина отрезка = sqrt((x1– x2)2 + (y1–y2) 2) – это на всякий случай для тех, кто в танке :(
– А вычислять квадрат выражения через Math.pow(expression, 2) – привилегия извращенцев :)
Данный метод реализован через разложение в ряд двух математических функций, что затратно по времени. Его используют, когда второй аргумент вещественный.
– Очевидное решение основано на классе ArrayList. У кого будет запас времени, поищите изящное решение на основе коллекции TreeSet.