Problem z hashset

0

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.

0

Pokaż kod przed obfuskacją...

0

Tworzysz iterator w momencie gdy set jest pusty, i ten iterator nie widzi pozniejszych dodanych pracownikow. Przynajmniej tyle z tego rozumiem.
Ogolnie robisz wszystko zle - jak szukasz w sposob w jaki szukasz (wyszukiwanie liniowe), to: 1. nie jest ci potrzebny set 2. tworz nowy iterator za kazdym razem. Ja bym to jednak rozwiazal w inny sposob: zdefiniuj sobie co unikalnie charakteryzuje robotnika (imie + nazwisko? pesel?) i zaimplementuj hashCode i equals w odpowiedni sposob; nastepnie dodawanie i wyszukiwanie usera jest proste - uzywasz metod add() i constains().

0

nie wiem czy o to chodzi...

 import java.util.*;

public class Test
{
    public Set set = new HashSet();
    public Urzednik urzednik;
    public Robotnik robotnik;
    private int r;
    private int i;
    public Iterator<Pracownik> 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;
        }
    }
}

W razie wątpliwości: robotnik dziedziczy po pracowniku, a dodając nowego pracownika korzystam z metody "przyjmij Robotnika".

0

@mućka - mam to zrobić w hashset. Ogólnie w zadaniu jest "zrealizuj zadanie wyskorzystując kolekcje: listę (ArrayList), zbiór nieuporządkowany (HashSet), odwzorowanie (HashMap). Zastosować różne metody przechodzenia po kolekcjach, w tym iteratory." Jedyne co mi przychodzi do głowy to w HashSet zastosować iterator, bo nie wiem w jaki inny sposób to zrobić, żeby w metodzie "znajdź" zwracało mi dany element. Wsadziłem tworzenie iteratora do metody tak, żeby mi tworzył za każdym razem iterator od nowa, w ten spsób:

 public Pracownik znajdz(String nazwisko)
    {
        Iterator<Pracownik> it = set.iterator();
        Pracownik p = null;
        while(it.hasNext() && !it.next().nazw.equals(nazwisko) )
        {   
        }
        if(it.hasNext())
        {
            p=it.next();
        }
        return p;
    }     

i niestety nic to nie zmieniło...

0
while(it.hasNext() && !it.next().nazw.equals(nazwisko) )
        {   
        }
        if(it.hasNext())
        {
            p=it.next();
        }

Pętla while iteruje dopóki nie znajdzie elementu z polem nazw równym nazwisko. Następnie w ifie wybierany jest kolejny element i zwracany. Czy o to ci chodziło? Polecam w ogóle przepisanie tego na for-eacha, będziesz miał mniej problemów. I dorób genericsy bo ci brakuje (np w Set).

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