Budowanie obiektu Sort na bazie Mapy<Enum, Enum>

0

Cześć, chciałbym zbudować obiekt Sort() na bazie Map<Column, Direction>. Mam problem z faktem, że Klasa Sort posiada tylko prywatny konstruktor, tylko musi być tworzona przez metodę statyczną by() lub and() dlatego mam problem z zainicjowaniem obiektu sort pierwszym elementem z mapy.

    private Sort buildSort(Map<WorklistColumn, Direction> columnsDirectionsmap){
        Sort sort = by("wartość inicjalna której nie chcemy", Direction.Ascending);
        for (Map.Entry<WorklistColumn, Direction> columnWithDirection : columnsDirectionsmap.entrySet()) {
            sort.and(columnWithDirection.getKey().toString(), columnWithDirection.getValue());
        }
        return sort;
    }

public class Sort {
    private List<Column> columns = new ArrayList();

    private Sort() {
    }

    public static Sort by(String column) {
        return (new Sort()).and(column);
    }

    public static Sort by(String column, Direction direction) {
        return (new Sort()).and(column, direction);
    }
    public Sort and(String name) {
        this.columns.add(new Column(name));
        return this;
    }

    public Sort and(String name, Direction direction) {
        this.columns.add(new Column(name, direction));
        return this;
    }
0

@witu12:

Mi się źle czyta ze względu na nazwy.
Co to właściwie jest Sort, bo obecnie to znaczy "wszystko, czyli nic"

Jakbym rozumiał zamiar, pewnie bym podpowiedział, ale nie rozumiem, żeby nie mówić długo: przez nazwę

Prosta zasada: znacząca nazwa, (po szkolnemu mówiąc nazwa klasy - rzeczownik, choć w miarę ambitniejszego OOP to może być rzeczownik pochodzący od nazwy czynności)

0
ZrobieDobrze napisał(a):

@witu12:

Mi się źle czyta ze względu na nazwy.
Co to właściwie jest Sort, bo obecnie to znaczy "wszystko, czyli nic"

Jakbym rozumiał zamiar, pewnie bym podpowiedział, ale nie rozumiem, żeby nie mówić długo: przez nazwę

Prosta zasada: znacząca nazwa, (po szkolnemu mówiąc nazwa klasy - rzeczownik, choć w miarę ambitniejszego OOP to może być rzeczownik pochodzący od nazwy czynności)

Sort to klasa z pakietu package io.quarkus.panache.common;

0

musisz wyciągnąć jedną parę z mapy i przekazać ją w konstruktorze, a dopiero potem zrobić pętle z resztą par. Na liście funkcyjnej z vavr byłoby to łatwiej zrobić

3

Jeśli konstruktor jest prywatny to z jakiegoś powodu.
Polecam zajrzeć do dokumentacji klasy/projektu żeby z tego jakiś potworek nie powstał.

2
private Sort buildSort(Map<WorklistColumn, Direction> columnsDirectionsmap){
        Sort sort = null;
        for (Map.Entry<WorklistColumn, Direction> columnWithDirection : columnsDirectionsmap.entrySet()) {
            if(sort==null) sort=Sort.by(columnWithDirection.getKey().toString(), columnWithDirection.getValue());
            else Sort.and(columnWithDirection.getKey().toString(), columnWithDirection.getValue());
        }
        return sort;
    }

Z tym że Mapa jest złym pojemnikiem na to co zamierzasz zrobić.
Bo będzie albo posortowana wg nazw kolumn, albo w porządku "pseudo losowym" jeżeli pod spodem HashMap

0
_13th_Dragon napisał(a):
private Sort buildSort(Map<WorklistColumn, Direction> columnsDirectionsmap){
        Sort sort = null;
        for (Map.Entry<WorklistColumn, Direction> columnWithDirection : columnsDirectionsmap.entrySet()) {
            if(sort==null) sort=Sort.by(columnWithDirection.getKey().toString(), columnWithDirection.getValue());
            else Sort.and(columnWithDirection.getKey().toString(), columnWithDirection.getValue());
        }
        return sort;
    }

Z tym że Mapa jest złym pojemnikiem na to co zamierzasz zrobić.
Bo będzie albo posortowana wg nazw kolumn, albo w porządku "pseudo losowym" jeżeli pod spodem HashMap

dzięki wielkie, zrobiłem to z iteratorem na mapie :)

1

Nie wiem na ile jeszcze pamiętam javę, ale dla listy można by zrobić coś takiego, bez wewnętrznego ifa

private Optional<Sort> buildSort(List<Tuple2<WorklistColumn, Direction>> list) {
  if (columnsDirectionsList.isEmpty()) return Optional.of();
  var head = list.get(0);
  var sort = Sort.by(head.getFirst().toString(), head.getSecond());
  var tail = list.subList(1, input.size());
  for(var element : tail) {
    sort = sort.and(element.getFirst().toString(), columnWithDirection.getSecond());
  }
  return Optional.of(sort);

Oczywiście najlepiej by było jakbyśmy mieli NonEmptyList (listę z gwarancją co najmniej jednego elementu) zamiast List, no ale nie wymagajmy za duzo od Javy

1 użytkowników online, w tym zalogowanych: 0, gości: 1