Usuwanie elementów z tablicy wypełnionej obiektami

0

Mam za zadanie stworzyć 2 metody, jedna wpisuje pracownika na listę(zatrudnia), a druga wypisuje pracownika z listy(zwalnia). Z drugą metodą mam problem, ale żeby go przedstawić najpierw pokaże kod.(Pracownicy dzielą się na Robotników i Urzędników i zadanie wymaga, aby byli zapisani w tablicy).

class Pracownik{

    
    String nazwisko;
    double etat;

    Pracownik(String nazwisko, double etat)
    {
        this.nazwisko=nazwisko;
        this.etat=etat;
    }
}

class Robotnik extends Pracownik{

    
    double liczbaPrzeprGodz;
    double stawkaGodz;
    int LIMIT=200;

    Robotnik(String nazwisko, double etat, double liczbaPrzeprGodz, double stawkaGodz)
    {
        super(nazwisko,etat);
        this.liczbaPrzeprGodz=liczbaPrzeprGodz;
        this.stawkaGodz=stawkaGodz;
    }
}

class Urzednik extends Pracownik{

    
    double wyplataPodstawowa;
    double premia;

    Urzednik(String nazwisko, double etat, double premia, double wyplataPodstawowa)
    {
        super(nazwisko,etat);
        this.wyplataPodstawowa=wyplataPodstawowa;
        this.premia=premia;
    }
}

Zadanie wymagało, aby (chyba) w ten sposób przedstawić początek kodu (jako, że dopiero zaczynam programować to z chęcią usłyszę jakieś uwagi jeżeli w tym kodzie są błędy, których ani ja, ani kompilator nie widzi), a teraz pokażę jak wykonałem pierwszą metodę, o której mówiłem na początku oraz miejsce, w którym mam problem z drugą metodą.

class Firma {
    
    Pracownik listaPracownikow[];
    int zatrudPracownicy=0;

    Firma(int a) {
        
    listaPracownikow = new Pracownik[a]; }

    void zatrudnijRobotnika(String nazwisko, double etat, double liczbaPrzeprGodz, double stawkaGodz) {
        
          if (zatrudPracownicy == listaPracownikow.length) {
            return;
       
 } else {
           
 Robotnik rob = new Robotnik(nazwisko, etat, liczbaPrzeprGodz, stawkaGodz);
           
 listaPracownikow[zatrudPracownicy] = rob;
            zatrudPracownicy++;}
    
public static void main(String args[]) {

Firma ob = new Firma(4);
        ob.zatrudnijRobotnika("Sienkiewicz",1,150,2);
        ob.zatrudnijRobotnika("Bulka",1,150,2); }


}



W ten sposób "wprowadzam w życie" pierwszą metodę - "void zatrudnijRobotnika()". W tym momencie zadania napotykam problem, ponieważ muszę napisać metodę, która po podaniu nazwiska pracownika usunie go z listy. Nie wiem w jaki sposób się za to zabrać, moja pierwsza myśl polegała na znalezieniu indeksu tablicy, w której się znajduje obiekt z podanym nazwiskiem i wartość tej tablicy nadpisać null'em, ale nie wiem w jaki sposób namierzyć, na jakiej pozycji w tablicy znajduje się poszukiwany obiekt. Utknąłem w tym momencie i jedyne, co udało mi się napisać to:

void zwolnij(String nazwisko){}

.
Przepraszam, ze ten kod w tak dziwny sposób wygląda, ale nie wiem czemu część się prezentuje normalnie, a część nie. Jeżeli coś jest niejasnego w tym co wyżej napisałem postaram się wytłumaczyć o co mi chodziło ;).

1

String nazwisko;
double etat;

  • We wszystkich klasach pola powinny mieć zasięg prywatny a dostęp do nich ewentualnie przez gettery, czyli:
private String nazwisko;

public String getNazwisko(){
return nazwisko;
}

itd reszta też.

void zatrudnijRobotnika(String nazwisko, double etat, double liczbaPrzeprGodz, double stawkaGodz) {

  • Nie lepiej przekazać Ci już konkretny obiekt? Np.
void zatrudnijPracownika(Pracownik pracownik)

Hmm...

if (zatrudPracownicy == listaPracownikow.length) {
return;
} else {

  • Wyrzuciłbym stąd ten return i wyświetlił komunikat że lista jest pełna albo coś podobnego.

  • Co do zwolnienia to możesz zrobić np. jakąś pętle która przechodzi przez wszystkie elementy Twojej tablic i sprawdza którego pracownik tak się nazywa.

Ps. Musi być tablica? Nie może być lista?

0

*Dzięki za radę z getterami!

void zatrudnijPracownika(Pracownik pracownik) 

*Niestety nie wiem jak dokładnie działa taka metoda (dopiero od niedawna zacząłem czytać o programowaniu obiektowym), ale na pewno trzeba zrobić 2 oddzielne metody - jedna zatrudniająca robotnika, druga urzędnika (tak wynika z treści zadania, które mam do zrobienia)

 

*Już podmieniłem w wersji na komputerze tego returna na odpowiedni komunikat ;)

 

*Właśnie próbowałem to zwolnienie zrobić za pomocą pętli, w ten sposób:

 void zwolnij(String nazwisko)
{
       for(int i=0; i<zatrudPracownicy; i++)
        {
                  if( listaPracownikow[i]==???)
                     {
                         listaPracownikow[i]=null;
                       }
         }
}

W tym momencie znowu utknąłem, ponieważ nie wiem, co wpisać w miejsce "???" aby if "wyłapał" pracownika, którego nazwiska podaję po przez metodę zwolnij.

 

Musi być w postaci tablicy

1

Idziesz w dobrym kierunku więc nie będę Ci dawał gotowego rozwiązania żeby nie psuć Ci zabawy ;)

1.  void zwolnij(String nazwisko)
{
     2.  for(int i=0; i<zatrudPracownicy; i++)
        {
              3.    if( listaPracownikow[i]==???)
                     {
                  4.       listaPracownikow[i]=null;
                       }
         }
}

Dodałem cyferki żeby było łatwiej analizować.

  1. Zauważ że przyjmujesz tu nazwisko, a więc to właśnie to pole będziesz porównywał do tych z listy pracowników
  2. Może tak zostać choć lepszym rozwiązaniem byłoby zrobienie for(int i=0; i<listaPracownikow.lenght(); i++) .
  3. Zacząłeś całkiem okej, ale w ten sposób listaPracownikow[i] wyciągniesz 1 cały obiekt pracownika. I okej, aczkolwiek interesuje Cię jego nazwisko a nie cały pracownik.
    Są więc 2 sposoby:
Pracownik pracownik = listaPracownikow[i];
if (pracownik.getNazwisko().equals(nazwisko){...}

Albo po prostu:

if (listaPracownikow[i].getNazwisko().equals(nazwisko){...}

Ważne: Porównuj Stringi nie przez znak porównania ale przez equals (Dlaczego: http://stackoverflow.com/a/7520464)
4. Ogólnie mogłoby tak być, aczkolwiek zastanów się jak rozwiążesz taki przypadek:

  • Deklarujesz że firma zatrudnia 4 osoby
  • Dodajesz 4 osoby do tablicy
  • Usuwasz pracownika o nazwisku X i Y którzy w tablicy byli na pozycji np. 1 i 3.
  • Chcesz znowu dodać pracownika, skąd będziesz wiedział w które miejsce możesz go dodać?
0

Dzięki za pomoc! ;)
Wydaje mi się, że teraz już wiem jak to zrobić.

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