Zadanie z implementacją interfejsów.

0

Witam, jako że pracuje jako Junior Dev to raz na jakiś czas wysyłam sobie CV na różne oferty pracy żeby się sprawdzić i zobaczyć czego mi brakuje itp. Dostałem takie zadanko ale w sumie nie bardzo wiem jak je rozwiązać. Prosiłbym o jakieś podpowiedzi z waszej strony i czego dokładnie mi brakuje i w jakim obszarze powinienem się kształcić dalej.
Chodzi o zaimplementowanie metod findBlocksByMaterial i findBlockByColor.

interface Structure {
// zwraca dowolny element o podanym kolorze
Optional<Block> findBlockByColor(String color);

// zwraca wszystkie elementy z danego materiału
List<Block> findBlocksByMaterial(String material);

//zwraca liczbę wszystkich elementów tworzących strukturę
int count();
}

public class Wall implements Structure {
private List<Block> blocks;
}

interface Block {
String getColor();
String getMaterial();
}

interface CompositeBlock extends Block {
List<Block> getBlocks();
}

Jeśli to jest podstawa i każdy Junior powinien w 5 sekund to zrobić to jest mi wstyd.

2

Co w tym trudnego? Klasa "Wall" jest implementacja interfejsu "Strucutre". W klasie 'Wall' masz już podaną listę bloków (List<Block> blocks) teraz w oparciu o tą listę dopinasz kontrakt, czyli po prostu dokonujesz implementacji metod, tak aby zwracały to za co są odpowiedzialne tyle ;)

1
Achmeda napisał(a):

Witam, jako że pracuje jako Junior Dev to
...

Jeśli to jest podstawa i każdy Junior powinien w 5 sekund to zrobić to jest mi wstyd.

Zależy od defincji juniora. W mojej - człowiek o może nie bardzo wielkiej, ale dodatniej użytecznosci dla firmy (tj nie będący kulą u nogi), zdecydowanie tak.
Lata boomu zmieniły postrzeganie juniora *), ale to na szczęście chyba wróci do normy.

*) HRejterzey: biorę pana, bo i tak mam trzystu zatrudnić

2

Jak wrzucisz to do ogarniętego IDE to szybko zauważysz, co i gdzie czego brakuje. Ogólnie tutaj to nie za bardzo jest o czym pisać - bo w klasach implementujących interfejsy brakuje metod zdefiniowanych w interfejsie. Do poczytania: https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

0

Wrzuciłem to do ogarniętego IDE i zacząłem implementować ale sypią mi się trzy metody i nie za bardzo wiem jak to rozwiązać.

@Override
public Optional<IBlock> findBlockByColor(String color) {
    if(blocks == null) {
        throw new IllegalArgumentException("Colour value is null!");        }
    return Optional.ofNullable(findByPredicate(matchedColour -> color.equals(matchedColour.getColor())));
}

@Override
public List<IBlock> findBlocksByMaterial(String material) {
    if (material == null) {
        throw new IllegalArgumentException("Material value is null!");
    }
    return findByPredicate(matchedMaterial -> material.equals(matchedMaterial.getMaterial()));
}

private IBlock findByPredicate(Predicate<IBlock> predicate) {
    return blocks.stream().flatMap(IBlock::toStream).filter(predicate).findFirst().orElse(null);
}

Gdzie tu popełniam błąd że mi w 2 metodzize wywala
2

nie podałeś nr linii i błędu więc nie bardzo wiem co twoje wywala oznacza, ale tak poza tym

Czy możesz wyjaśnić jaki jest sens ( co to wnosi) - takie konstrukcji?

  if(blocks == null) {
        throw new IllegalArgumentException("Colour value is null!");        }
0
jarekr000000 napisał(a):

nie podałeś nr linii i błędu więc nie bardzo wiem co twoje wywala oznacza, ale tak poza tym

Czy możesz wyjaśnić jaki jest sens ( co to wnosi) - takie konstrukcji?

  if(blocks == null) {
        throw new IllegalArgumentException("Colour value is null!");        }

strzelam że tam miało być color == null

@Achmeda nie rób IBlock bo wtedy wyglądasz jak programista C#
Poza tym w tym co podałeś w pierwszym poście nigdzie nie masz IBlock tylko Block

BTW to się nie kompiluje, typy się nie zgadzają. findByPredicate zwraca IBlock a potem jest findBlocksByMaterial zwraca List<IBlock>
A mamy magiczną linie return findByPredicate(matchedMaterial -> material.equals(matchedMaterial.getMaterial())); XD

0
KamilAdam napisał(a):
jarekr000000 napisał(a):

nie podałeś nr linii i błędu więc nie bardzo wiem co twoje wywala oznacza, ale tak poza tym

Czy możesz wyjaśnić jaki jest sens ( co to wnosi) - takie konstrukcji?

  if(blocks == null) {
        throw new IllegalArgumentException("Colour value is null!");        }

strzelam że tam miało być blocks == null

@Achmeda nie rób IBlock bo wtedy wyglądasz jak programista C#
Poza tym w tym co podałeś w pierwszym poście nigdzie nie masz IBlock tylko Block

Tak, IBlock to interfejs który implementuje Block gdzie mam później trochę kodu itp.

2
Achmeda napisał(a):

Tak, IBlock to interfejs który implementuje Block gdzie mam później trochę kodu itp.

Ale nie taka byłą treść zadania.

IBlock to interfejs który implementuje Block

Zaraz to co tu jest implementacją a co interfejsem?

Update. Ponieważ to na rozmowę kwalifikacyjną a nie na studia więc pewnie tego kodu nie obronisz masz tu implementację która się chociaż kompiluje. Nie sprawdzałem czy działa

  public class Wall implements Structure {
    private List<Block> blocks;
    
    public int count() {
      return blocks.size();
    }
    
    public List<Block> findBlocksByMaterial(String material) {
      return blocks.stream().filter(it -> material.equals(it.getMaterial())).toList();
    }
    
    public Optional<Block> findBlockByColor(String color) {
      return blocks.stream().filter(it -> color.equals(it.getColor())).findFirst();
    }
  }
2

Pytanie jak ta implementacja ma się zachowywać dla CompositeBlock. Ma schodzić rekurencyjnie? No ale wtedy getMaterial dla CompositeBlock nie ma sensu, bo on może być z więcej niż jednego materiału. W ogóle takie dziedziczenie CompositeBlock z Block jest paskudne.

0

Takie dostałem zadanie, nie wymyśliłem sobie go.
Moim zdaniem nie jest ono dobre dla Juniora.

5

Z całym szacunkiem, ale to są podstawy podstaw. To nie jest jakieś zadanie na myślenie, po prostu sprawdza czy rozumiesz jak się używa interfejsów. Zadanie było dosyć proste, ale z tego co widzę to zacząłeś kombinować tworząc jakieś byty typu IBlock.

Dla mnie to wygląda, jakbyś treść zadania wrzucił do ChatGPT, który treść zrozumiał tak, że trzeba dopisać nowy interfejs. Nawet jeśli tak nie jest to ewidentnie masz problemy z najprostszymi rzeczami - nie potrafisz samodzielnie zlokalizować błędu, ani nawet odczytać komunikatu z kompilatora. Takie rzeczy to student po semestrze Javy powinien umieć, a co dopiero junior.

0

Wiem, może to wygląda słabo fakt...
Polecicie jakieś dobre kursy Javy które mógłbym sobie zrobić bo robiłem do tej pory Java Masterclass Udemy Tima Buchalki

0

Udało mi się trochę ten kod zrefactorować i nie ma błędów kompilacji i sporo moich testów przechodzi a spora część nie.

 private List<IBlock> blocks = new LinkedList<>();

    public Wall(Block... blocks) {
        this.blocks = Arrays.stream(blocks).collect(Collectors.toList());
    }

    @Override
    public Optional<IBlock> findBlockByColor(String color) {
        Objects.requireNonNull(color);
        return blocks.stream().filter(it -> color.equals(it.getColor())).findFirst();
    }

    @Override
    public List<IBlock> findBlocksByMaterial(String material) {
        return Objects.requireNonNull(blocks.stream().filter(it -> material.equals(it.getMaterial())).collect(Collectors.toList()));
    }

    @Override
    public int count() {
        return (int) blocks.stream().flatMap(IBlock::toStream).count();
    }

Myślę że jest problem z tą metodą :

public Stream<IBlock> toStream() {
    return Stream.concat(super.toStream(),
            blocks.stream().flatMap(IBlock::toStream));
}

Jakby coś z nią nie było okej. Ma ktoś jakiś pomysł?

0

Myślę że udało mi się ogarnąć to zadanie jakoś, męczę się z testami bo mi wywalają błędy ale myślę że można uznać post za rozwiązany

0

jaka jest dziedzina tego kodu?
grafika 3D? Gamedev? (findBlocksByMaterial, wall itp.)

1
Achmeda napisał(a):

Udało mi się trochę ten kod zrefactorować i nie ma błędów kompilacji i sporo moich testów przechodzi a spora część nie.

 private List<IBlock> blocks = new LinkedList<>();

    public Wall(Block... blocks) {
        this.blocks = Arrays.stream(blocks).collect(Collectors.toList());
    }
   

Jakby coś z nią nie było okej. Ma ktoś jakiś pomysł?

Tu nic nie jest okej.
kropeczki, czyli argumenty o zmiennej ilości, są dokładnie tablicą. Ostatecznie mają trafić na listę, do czego konwersja jest bardzo prosta. Wytaczasz armatę streamów albowiem ponieważ ?

Google Chat to pisał ?

Dwie metody do pobierania danych 'By' ale jedno count - nie znam załozeń, ale miga mi pomarańczowe. Już nie będę sie znęcał, że count() jest zrobione tak, aby było maksymalnie p...ne i kosztowne

0
AnyKtokolwiek napisał(a):
Achmeda napisał(a):

Udało mi się trochę ten kod zrefactorować i nie ma błędów kompilacji i sporo moich testów przechodzi a spora część nie.

 private List<IBlock> blocks = new LinkedList<>();

    public Wall(Block... blocks) {
        this.blocks = Arrays.stream(blocks).collect(Collectors.toList());
    }
   

Jakby coś z nią nie było okej. Ma ktoś jakiś pomysł?

Tu nic nie jest okej.
kropeczki, czyli argumenty o zmiennej ilości, są dokładnie tablicą. Ostatecznie mają trafić na listę, do czego konwersja jest bardzo prosta. Wytaczasz armatę streamów albowiem ponieważ ?

Google Chat to pisał ?

Dwie metody do pobierania danych 'By' ale jedno count - nie znam załozeń, ale miga mi pomarańczowe. Już nie będę sie znęcał, że count() jest zrobione tak, aby było maksymalnie p...ne i kosztowne

Żaden Google Chat mi tego nie pisał xD Sam to pisałem. Aż tak jest źle?
Takie dostałem 'założenia' że mają być 2 takie metody i jeden count.

0

A tak

    private List<Block>list;

    public Wall(List<Block> list) {
        this.list = list;
    }

    @Override
    public Optional<Block> findBlockByColor(String color) {
        for (Block b : list
        ) {
            if (b.getColor().equals(color)) {
                return Optional.of(b);

            }
        }

            return Optional.empty();
        }




    @Override
    public List<Block> findBlocksByMaterial(String material) {
        List<Block>blockList =new ArrayList<>();
        for (Block b:list
             ) {
            if (b.getMaterial().equals(material)){
                blockList.add(b);
            }

        }
        return blockList ;
0
bbzzyyczczeek napisał(a):

A tak

    private List<Block>list;

    public Wall(List<Block> list) {
        this.list = list;
    }

    @Override
    public Optional<Block> findBlockByColor(String color) {
        for (Block b : list
        ) {
            if (b.getColor().equals(color)) {
                return Optional.of(b);

            }
        }

            return Optional.empty();
        }




    @Override
    public List<Block> findBlocksByMaterial(String material) {
        List<Block>blockList =new ArrayList<>();
        for (Block b:list
             ) {
            if (b.getMaterial().equals(material)){
                blockList.add(b);
            }

        }
        return blockList ;

to łamanie lini przed ) wygląda dziwnie. Jeszcze czegoś takiego nie widziałem XD

A z poważniejszych uwag to jakby był 2013 rok i używalibyśmy javy 7 to był powiedział że dobrze. Ale od 2014 mówię -> Użyj streamów

0

To łamanie lini przed ) to IntelliJ tak generuje foreach .
. Pytanie jest bardzo proste a używając streamów nie wiem czy pytający będzie wiedział dlaczego tak a nie inaczej.

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