Skocz do zawartości
pamparampa

[java] - Problem z hashset

Rekomendowane odpowiedzi

Witam. Mam następujący problem: Mam program, w którym można zarządzać firmą, np. dodawać pracowników, liczyć ich wypłatę itd. Wszyscy pracownicy są zapisaniu w kolekcji hashset. Przedstawiam początek głównej klasy i dwie metody:

import java.util.*;

public class Test
{
   public Set set = new HashSet();
   public Urzednik urzednik;
   public Robotnik robotnik;
   private int r;
   private int i;
   public <Pracownik>Iterator it = set.iterator();

   public Pracownik znajdz(String nazwisko)
   {
       Pracownik p = null;
       while(it.hasNext() && !it.next().nazw.equals(nazwisko) )
       {   
       }
       if(it.hasNext())
       {
           p=it.next();
       }
       return p;
   }     
public boolean przyjmijRobotnika(String nazwisko,double etat,int godzin)
   {
       robotnik = new Robotnik(nazwisko,etat,godzin);
       if(znajdz(nazwisko)==null)
       {
           set.add(robotnik);
           return true;
       }
       else
       {
           return false;
       }
   }
}

I próbuję dodać nowego pracownika, zwraca mi true, a potem korzystam z metody 'znajdź' i okazuje się, że zwraca mi null, czyli tak jakby tego pracownika nie było. Dodam jeszcze, że przy kompilowaniu wyskakuje mi takie okienko :"<ścieżka do klasy Test> uses unchecked or unsafe operations. Recompile with -Xlint:unchecked for details". Nie wiem czy to ma jakikolwiek związek z problemem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Znajome klasy, czyżby PWr?

A błąd masz w wyszukiwaniu, bo w pętli while it.nextem pobierasz pracownika do jej warunku i gdy trafi na dobrego to przerywa pętle, a w ifie pobierasz już następnego pracownika, zamiast tego prawidłowego. Musisz po prostu w warunku pętli dać samo hasNext, a w niej dopiero dać ifa sprawdzającego nazwisko (przy czym pobierz pracownika do jakiejś zmiennej pomocniczej, a dopiero potem sprawdzaj ifem, czy to jest ten prawdiłowy).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A nie lepiej:

 

for (Iterator<Pracownik> i = it.iterator(); i.hasNext(); ) {
    if (i.nazw.equals(nazwisko)) {
      return i;
    }
}
return null;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Równie dobrze można użyć foreacha, bo skoro tylko odczytujemy elementy, to jest to najprostsza konstrukcja:

for (Pracownik i: set)
{
if (i.nazw.equals(nazwisko))
return i;
}
return null;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×