Dodawania do HashSet

0

Jak napisać metode dodająca obiekt osoba klasy osoba o atrybutach (Imie nazwisko pesel) do zbioru Hashset (w klasie lista_osoba) tylko wtedy jeżeli ma inny pesel a imie nazywisko mogą sie powtarzać?

0

Acha pesel to string.
Napisałem w klasie osoba takie coś w Klasie osoba

public int hashCode() {
        return this.pesel;
    }
//Tu wywala błąd że hashCode to int a mi zwraca Stringa
//jak daje Integer.Parseto nie działa : /

	public boolean equals( Uczen gosc)
	{ 
		if his.pesel==gosc.pesel)
		else return false;
		
	}
}
</quote>
0

Dobra z tym wyżej juz sobie poradziłem teraz tylko 1 pytanie czy jak 2 obiekty mają takie same hashcody chyba nie powinien dodawać drugiego obiektu do HashSet'u ??

0

Jeszcze jedno pytanie mam czemu nie poruszam sie po liście ??

Set<Uczen> U=new HashSet<Uczen>();
U=Szkola1.getOddzial(0).harm.get(0).grupa;

for(int i=0;i<U.size();i++)
{	U.p.next();
	Uczen u=U.iterator().next();
	System.out.println(u.nazwisko);
}

Cały czas drukuje mi to samo nazwisko, dlaczego ??

0

Ponieważ cały czas wykonujesz to samo zadanie. Nawet nie używasz zmiennej i, którą zadeklarowałeś w pętli. Użyj iteratora w pętli.

0

Użyj tego tak:

Set<Uczen> U=new HashSet<Uczen>();
U=Szkola1.getOddzial(0).harm.get(0).grupa;

for(Uczen u: U)
  System.out.println(u.nazwisko);

Posiadanie przez klasę iteratora (zaimplementowanie interfejsu Iterable<E>) oznacza, że będzie można zawsze skorzystać z tablicowej postaci for.

0
for(Uczen u: U)
  System.out.println(u.nazwisko);

to spowoduje wyświetlenie wszystkich a ja chce np wyświetlic tylko 3
to jak to zrobić ??

0

No to by było coś takiego:

	Set<Uczen> U=new HashSet<Uczen>();
	U=Szkola1.getOddzial(0).harm.get(0).grupa;
	
	//Zakres np. od 7 do 10
	Iterator<Uczen> it = U.iterator();
	int i = 0;
	while(++i < 7)
		it.next(); //przewijamy niepotrzebne
	for(Uczen u = it.next(); it.hasNext() && ++i < 10; u = it.next())
	{
		//...
		System.out.println(u.nazwisko);
	}

Z tym, że iterowanie po numerach mija się z celem dla którego był zaprojektowany HashSet. Takie wyszukiwanie w tym zbiorze jest wybitnie nieefektywne.
To jest zbiór, a więc interesować Cię powinno tylko testowanie istnienia w nim elementu (referencji do niego) lub wykonywania na nim takich zadań jak zawieranie, przecięcie, dopełnienie itp. Do obróbki po indeksach służą tablice lub ArrayList. Tak więc po prostu źle to używasz lub zły kontener wybrałeś.

0

Wielkie dzieki :)

Musze zrobić usuwanie elementów z tego zbioru jeżeli jest wiecej niz np poda użytkownik.
np mamy zbior 10 obiektów a użytkownik wywoła program z 5 wiec trzeba 5 obiektów usunąc.
Do tego potrzebowałem to przesuwanie.

btw Hashset nie powinien dodawac dwóch wartości które maja taki sam hashcode? Dobrze myśle ??

Wiec przy tej metodzie w klasie Osoba:

public int hashCode() {
        return this.pesel.hashCode();
    }

public boolean equals( Osoba gosc)
        {
                if his.pesel==gosc.pesel)
                else return false;
               
        }
}

Wywołanie
nazwa_zbioru.add(Osoba1)
nie powinno dodawać Osoba1 jeżeli w zbiorze sie znajduje już jakis obiekt typu Osoba który ma taki sam pesel jak Osoba 1
Dobrze myśle ??

0

Dobrze. Wszystkie Zbiory (Set) dodają tylko jedną unikalną wartość obiektu czyli nie mogą się w nim znaleźć elementy, dla których prawdziwe będzie e1.equals(e2).

Natomiast mogą się powielać wartości metody hashCode() dla różnych wartości. A to dlatego, że tablica mieszająca to tak naprawdę tablica list elementów o tych samych kodach. Same kody są zwykle zawijane modulo rozmiar tablicy (inaczej każda tablica mieszająca musiałaby mieć 2 mld indeksów). Przy wyszukiwaniu najpierw szybko po indeksie wybierana jest lista, na której na pewno musi być szukany element, a potem nieco wolniej przeszukiwana właściwa lista. Oczywiście im bardziej równomierny rozkład kodów tym wyszukiwanie jest szybsze.

0

Po co Ci jakieś Set-y. Nie możesz wykorzystać po prostu zwykłej listy ? Jeśli zaimplementowałeś metodę equals, to możesz wykorzystać ją bez problemu.

                ArrayList<Uczen> uczniowie = new ArrayList<Uczen>();
		uczniowie.add(new Uczen("Zenek", "Kros", new Integer(1230)));
		uczniowie.add(new Uczen("Antoni", "Zys", new Integer(1234)));
		uczniowie.add(new Uczen("Jan", "Pol", new Integer(1213)));
		uczniowie.add(new Uczen("Tomek", "Arab", new Integer(1123)));
		
		Uczen uczen = new Uczen("Jan", "Pol", new Integer(1213));
		if(!uczniowie.contains(uczen)){
			System.out.print("Uczen istnieje juz w spisie !");
		}
0

To jak zrobić aby nie dodawał dwóch obiektów które maja ten sam atrybut w moim wypadku pesel??

0

Zrobiłem to na ArrayList ale chodzi o to zebym przećwiczył Hashseta na ćwiczeniach w szkole .... i sam rozumiesz.

0

Klasa Osoba:

       public abstract class Osoba {
	
	protected String _imie;
	protected String _nazwisko;
	protected Integer _pesel;
	
	public Osoba(String imie, String nazwisko, Integer pesel)
	{
		_imie = imie;
		_nazwisko = nazwisko;
		_pesel = pesel;
	}
	
	public boolean equals(Osoba osoba){
		if(osoba == null)
			return false;
		return _pesel.equals(osoba._pesel);
	}
}

klasa Uczen:

public final class Uczen extends Osoba {

	public Uczen(String imie, String nazwisko, Integer pesel) {
		super(imie, nazwisko, pesel);
	}
}

Użycie:

                HashSet<Uczen> hashSet = new HashSet<Uczen>();
		hashSet.add(new Uczen("Zenek", "Kros", new Integer(1230)));
		hashSet.add(new Uczen("Antoni", "Zys", new Integer(1234)));
		hashSet.add(new Uczen("Jan", "Pol", new Integer(1213)));
		hashSet.add(new Uczen("Tomek", "Ara", new Integer(1123)));
		
		Uczen uczen = new Uczen("Jan", "Pol", new Integer(1213));
		if(!hashSet.contains(uczen)) {
			System.out.print("Uczen istnieje juz w spisie !");
		}

Wykorzystujesz implementację metody equals.

0

Wielkie dzieki :)

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