diff --git a/app/src/main/java/itmo/lab5/cli/helpers/FlatComparatorFactory.java b/app/src/main/java/itmo/lab5/cli/helpers/FlatComparatorFactory.java new file mode 100644 index 0000000..df3ee74 --- /dev/null +++ b/app/src/main/java/itmo/lab5/cli/helpers/FlatComparatorFactory.java @@ -0,0 +1,68 @@ +package itmo.lab5.cli.helpers; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import itmo.lab5.models.Flat; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * The FlatComparatorFactory class provides functionality to create comparators + * for sorting Flat objects based on various fields such as ID, name, area, + * number of rooms, and creation date. + */ +public class FlatComparatorFactory { + public enum SortField { + ID, + NAME, + AREA, + NUMBER_OF_ROOMS, + CREATION_DATE + } + + /** + * Returns a Comparator for Flat objects based on the specified sort field. + * + * @param field the field by which to sort the Flat objects + * @return a Comparator for Flat objects + * @throws IllegalArgumentException if the specified sort field is unknown + */ + public static Comparator getComparator(SortField field) { + switch (field) { + case ID: + return Comparator.comparingInt(Flat::getId); + case NAME: + return Comparator.comparing(Flat::getName); + case AREA: + return Comparator.comparingDouble(Flat::getArea); + case NUMBER_OF_ROOMS: + return Comparator.comparingInt(Flat::getNumberOfRooms); + case CREATION_DATE: + return Comparator.comparing(Flat::getCreationDate); + default: + throw new IllegalArgumentException("Unknown sort field: " + field); + } + } + + /** + * Sorts a HashMap of Flat objects based on the specified sort field and + * returns a new sorted HashMap. + * + * @param flatsMap the HashMap of Flat objects to be sorted + * @param field the field by which to sort the Flat objects + * @return a new HashMap containing the sorted Flat objects + */ + public static HashMap sortFlats(HashMap flatsMap, SortField field) { + List flatList = new ArrayList<>(flatsMap.values()); + Collections.sort(flatList, getComparator(field)); + + + var sortedMap = new HashMap(); + for (Flat flat : flatList) { + sortedMap.put(flat.getId(), flat); + } + return sortedMap; + } +} \ No newline at end of file diff --git a/app/src/main/java/itmo/lab5/parser/Reader.java b/app/src/main/java/itmo/lab5/parser/Reader.java index 0c9cde2..c0afd27 100644 --- a/app/src/main/java/itmo/lab5/parser/Reader.java +++ b/app/src/main/java/itmo/lab5/parser/Reader.java @@ -10,6 +10,7 @@ import java.util.Scanner; import java.util.stream.Collectors; import itmo.lab5.models.enums.*; +import itmo.lab5.cli.helpers.FlatComparatorFactory; import itmo.lab5.models.*; public class Reader { @@ -42,17 +43,13 @@ public class Reader { collection.put(parsedFlat.getId(), parsedFlat); } - collection = collection.entrySet() - .stream() - .sorted(HashMap.Entry.comparingByKey()) - .collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (oldValue, newValue) -> oldValue, - HashMap::new)); - + var sortedById = FlatComparatorFactory.sortFlats( + collection, + FlatComparatorFactory.SortField.ID + ); + scanner.close(); - return collection; + return sortedById; } private static Flat parseFlat(String lineToParse) throws IllegalArgumentException, ParseException { diff --git a/app/src/main/java/itmo/lab5/parser/Writer.java b/app/src/main/java/itmo/lab5/parser/Writer.java index 6a770f1..a9d3919 100644 --- a/app/src/main/java/itmo/lab5/parser/Writer.java +++ b/app/src/main/java/itmo/lab5/parser/Writer.java @@ -1,5 +1,6 @@ package itmo.lab5.parser; +import itmo.lab5.cli.helpers.FlatComparatorFactory; import java.io.*; import java.text.SimpleDateFormat; import java.util.HashMap; @@ -13,34 +14,39 @@ public class Writer { try (FileOutputStream fos = new FileOutputStream(filename); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter writer = new BufferedWriter(osw)) { + + flats = FlatComparatorFactory.sortFlats( + flats, + FlatComparatorFactory.SortField.ID + ); + + for (Flat flat : flats.values()) { + String date = ""; - for (Flat flat : flats.values()) { - String date = ""; + try { + date = dateFormat.format(flat.getCreationDate()).toString(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } - try { - date = dateFormat.format(flat.getCreationDate()).toString(); - } catch (Exception e) { - System.out.println(e.getMessage()); + String line = String.format("%d,%s,%d,%d,%s,%.2f,%d,%s,%s,%s,%s,%d,%d\n", + flat.getId(), + flat.getName(), + flat.getCoordinates().getX(), + flat.getCoordinates().getY(), + date, + flat.getArea(), + flat.getNumberOfRooms(), + flat.getFurnish(), + flat.getView() != null ? flat.getView() : "", + flat.getTransport(), + flat.getHouse() != null ? flat.getHouse().getName() : "", + flat.getHouse() != null ? flat.getHouse().getYear() : 0, + flat.getHouse() != null ? flat.getHouse().getNumberOfFloors() : 0); + + writer.write(line); } - String line = String.format("%d,%s,%d,%d,%s,%.2f,%d,%s,%s,%s,%s,%d,%d\n", - flat.getId(), - flat.getName(), - flat.getCoordinates().getX(), - flat.getCoordinates().getY(), - date, - flat.getArea(), - flat.getNumberOfRooms(), - flat.getFurnish(), - flat.getView() != null ? flat.getView() : "", - flat.getTransport(), - flat.getHouse() != null ? flat.getHouse().getName() : "", - flat.getHouse() != null ? flat.getHouse().getYear() : 0, - flat.getHouse() != null ? flat.getHouse().getNumberOfFloors() : 0); - - writer.write(line); - } - return "Collection has been saved to the file successfully."; } catch (IOException e) { e.printStackTrace();