Porownanie objektow za pomoca wygenerowanej metody equals

0

Hej jestem poczatkujacy w javie jak i ogolnie w programowaniu. Chialem stworzyc dla treningu prosta klase uzytkownika i w klasie testowej porownanie tych uzytkownikow nie mam pomyslu co robie zle, poniewaw outpucie i tak pojawia sie uzytkownik podwojnie. Jak rozumiem petle for przechodza pod koniec przez 3 usera i sprawdza ich pozniej pod katem podopienstwa z j tymi userami 4 w zwyz dlatego Wojtek jest powielony. Jednak jak zaimplementowac ta funkcje zeby wyswetlic tylko pojedynczo userow na normalnych tablicach obiektowych bez stosowania List. Pozdrawiam

package test_package;

public class User {

	private String name;
	private String surname;
	private String eMail;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSurname() {
		return surname;
	}
	public void setSurname(String surname) {
		this.surname = surname;
	}
	public String geteMail() {
		return eMail;
	}
	public void seteMail(String eMail) {
		this.eMail = eMail;
	}

//	public User(){}

	public User (String name, String surname, String eMail){
		setName(name);
		setSurname(surname);
		seteMail(eMail);
	}

	@Override
	public String toString() {
		return "User: name= " + name + ", surname= " + surname + ", eMail= "
				+ eMail;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((eMail == null) ? 0 : eMail.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result
				+ ((surname == null) ? 0 : surname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (eMail == null) {
			if (other.eMail != null)
				return false;
		} else if (!eMail.equals(other.eMail))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (surname == null) {
			if (other.surname != null)
				return false;
		} else if (!surname.equals(other.surname))
			return false;
		return true;
	}

}
 
package test_package;

public class Test_user {

	public static void main(String[] args) {
		User[] users = new User[8];
		users[0] = new User("Tomek", "Atomek", "[email protected]");
		users[1] = new User("Wojtek", "Kowalski", "[email protected]");
		users[2] = new User("Anna", "Hanna", "[email protected]");
		users[3] = new User("Wojtek", "Kowalski", "[email protected]");
		users[4] = new User("Tomek", "Atomek", "[email protected]");
		users[5] = new User("Tomek", "Atomek", "[email protected]");
		users[6] = new User("Tomek", "Atomek", "[email protected]");
		users[7] = new User("Anna", "Hanna", "[email protected]");
//		users[8] = new User("Tomek", "Atomek", "[email protected]");

		User[] temp = new User[users.length];
		for (int i = 0; i < users.length -1; i++) {
			for (int j = i +1; j < users.length -1 ; j++) {
				if (!users[i].equals(users[j])) {
					temp[i] = users[i];
				}
			}
		}
//		for (int i = 1; i < users.length; i++) {
//			if (users[i-1]!= users[i]) {
//				temp[i] = users[i];
//			}
//		}
		for (int i = 0; i < temp.length; i++) {
			if (temp[i] != null) {
						System.out.println(temp[i]);
					}

		}
	}

} 
0

Przepraszam za literówki i brak polskich znaków, chciałem edytować post ale zapomniałem sie zalogować i pisałem z gościa.

1

Uzyj Set<User> jak czlowiek ;)

Co do Twojego algorytmu to przestudiuj go dokladnie.
W Twojej petli idziesz po userach a nastepnie sprawdzasz czy ktorys z nastepnych jest inny niz ten aktualnie sprawdzany, jesli znajdziesz innego to go dodajesz.

Zmien kod dla przykladu na:

        users[0] = new User("Tomek", "Atomek", "[email protected]");
        users[1] = new User("Anna", "Hanna", "[email protected]");
        users[2] = new User("Anna", "Hanna", "[email protected]");

Wynikiem bedzie tylko Tomek, bez Anny. Dlaczego? Ano:
dla i = 0 (Tomek) w petli wewnetrznej okazalo sie, ze weszlismy do if (!users[i].equals(users[j])) bo Tomek jest inny niz nastepne rekordy i nastepuje przypisanie temp[i] = users[i];
dla i = 1 (Anna) w petli wewnetrznej nie wejdziemy do if (!users[i].equals(users[j])) bo pozostaly rekord to Anna czyli taki sam jak aktualny pod i.

Zrobmy jeszcze inaczej, dajmy 3 Tomkow:

        users[0] = new User("Tomek", "Atomek", "[email protected]");
        users[1] = new User("Tomek", "Atomek", "[email protected]");
        users[2] = new User("Tomek", "Atomek", "[email protected]");

Wynik? Pusta tablica.

Rozpisz sobie to chociazby na kartce jak masz teraz problem ze zrozumieniem :)

0

Bardzo dziękuję za szybką odpowiedź, chciałbym uniknąć korzystania z Collections, ponieważ specjalnie dzieliłem dane aby później móc zaimpelemntować funkcję importu np. z Excel a w jeszcze odleglejszej przyszłości zapisu niepowielających się userów do np. bazy danych w przypadku kolekcji bede musiał znowu dzielić Stringa i wyciągać z niego imie, nazwisko i e-mail, aby móc później pododawać poszczgólne rekordy do odpowiednich kolumn.

0

Nie rozumiem o co Ci chodzi :)

Jaka jest roznica miedzy User[] a Set<User> dla Twojego przypadku? Nawet jesli chcesz miec User[] to mozna bardzo prosto przerobic Set<User> na User[].

0

Przepraszam jestem jeszcze mocno początkujący. Postaram wyrazić moją myśl na przykładzie. W momencie gdy mam klasę user i chcę pobrać dane z pliku Excel np.

				for(int i= 0; i <= sheet.getLastRowNum(); i++ ){
						row = sheet.getRow(i);
						String name = row.getCell(0).getStringCellValue();
						String surname = row.getCell(1).getStringCellValue();
						String email = row.getCell(2).getStringCellValue();
						}

To mam już gotowe składowe obiektu, które moge osobno zapisac do bazy danych bądź za pomocą geterów miec do nich dostęp jeśli chcę tylko np imię drugiego User'a i adres e-mail Usera czwartego. Próbowałem już kolekcji i ładnie sortują i odrzucają powielonych userów, ale później nie mam dostępu do składowych obiektu ponieważ jeden User to ciąg znaków String.

0

ale później nie mam dostępu do składowych obiektu ponieważ jeden User to ciąg znaków String.

Przeciez gdy masz obiekt klasy User mozesz z latwoscia sie dostac do jego skladowych, np: user.getName()?

Zreszta uzywasz juz obiektow klasy User. Masz tablice obiektow klasy User, naprawde bedzie lepiej jezeli skorzystasz z kolekcji - nie widze Twojego problemu ani troche.

Moze pokaz caly kod z kolekcjami i co chcesz osiagnac bo wydaje mi sie, ze naprawde robisz cos zle.

0

Postaram się w miarę na szybko napisać kod z wykorzystaniem kolekcji i będę wdzięczny jak wskażesz mi gdzie moja logika jeszcze zawodzi,a tak w skrócie chodzi mi o to.
Mam plik Excel z danymi.
Za pomocą javy chce pobrać te dane i później zapisać je do bazy danych.
jak używam tablic użytkowników:
to pobieram po kolei || np. String name, String surname, String eMail z pliku Excel ---> Tworzę tablice userów w javie i zapisuję w niej pobranych użytkowników z pliku Excel ---> Filtruje tych użytkoników w javie i ---> Na końu zapisuje za pomocą metody metoda.name = users[i].getName(); po kolei użytkowników do bazy danych. Niestety kodu z bazą danych jeszcze nie mam ponieważ sqla ucze się od niedawna i jeszcze nie skonczyłem mojej mini bazy danych.

0

---> Tworzę tablice userów w javie i zapisuję w niej pobranych użytkowników z pliku Excel ---> Filtruje tych użytkoników w javie i --->

No i to jak najbardziej moze byc zamienione na

Set<User>

gdzie filtracja dokona sie automatycznie bo Set nie zawiera duplikatow.

Zakladam, ze nie potrafiles przeiterowac Seta (wspominales cos o jednym Stringu). Musisz uzyc iteratora :)

0

Tak więc klasę testową dla seta już utworzyłem teraz prosiłbym o podpowiedź jak mogę odwoływać się do pojedyńczych składowych tzn. jak wzyciągnąć np. nazwisko usera nr 2

package test_package;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test_user_Set {

	public static void main(String[] args) {

		Set<User> users = new HashSet<>();

		users.add(new User("Tomek", "Atomek", "[email protected]"));
		users.add(new User("Wojtek", "Kowalski", "[email protected]"));
		users.add(new User("Anna", "Hanna", "[email protected]"));
		users.add(new User("Tomek", "Atomek", "[email protected]"));
		users.add(new User("Wojtek", "Kowalski", "[email protected]"));

		System.out.println(users.size());

		Iterator<User> usersIterator = users.iterator();
		while (usersIterator.hasNext()) {
			User user = (User) usersIterator.next();
			System.out.println(user);
		}
	}

}

Output console:
3
User: name= Anna, surname= Hanna, eMail= [email protected]
User: name= Wojtek, surname= Kowalski, eMail= [email protected]
User: name= Tomek, surname= Atomek, eMail= [email protected]

Okej to pytanie było nieprzemyslane wystarczy dodać do iteratora

		Iterator<User> usersIterator = users.iterator();
		while (usersIterator.hasNext()) {
			User user = (User) usersIterator.next();
			System.out.println(user.getName() + " "+user.getSurname()+ " " + user.geteMail() );
		}

Tak wcześniej też próbowałem najbardziej chodzi mi o fakt że w przypadku seta jak pobieram dane z pliku Excel:

					for(int i= 1; i <= sheet.getLastRowNum(); i++ ){
						row = sheet.getRow(i);
						String name = row.getCell(0).getStringCellValue();
						String surname = row.getCell(1).getStringCellValue();
						String email = row.getCell(2).getStringCellValue();	
						}

To jak ja mogę te dane zapisywać w użytkowników. W sensie tworzyć ich, aby móc później ewentualnie zapisać do bazy danych

1

Bardzo prosto:

System.out.println(user.getSurname());

To powinno wystarczyc (bez rzutowania)

User user = usersIterator.next();

Mozesz uzyc LinkedHashSet jesli chcesz zachowac kolejnosc:

Set<User> users = new LinkedHashSet<>();

EDIT:

To jak ja mogę te dane zapisywać w użytkowników. W sensie tworzyć ich, aby móc później ewentualnie zapisać do bazy danych

Set<User> users = new LinkedHashSet<>();

for(int i= 1; i <= sheet.getLastRowNum(); i++ ){
                        row = sheet.getRow(i);
                        String name = row.getCell(0).getStringCellValue();
                        String surname = row.getCell(1).getStringCellValue();
                        String email = row.getCell(2).getStringCellValue();    
                        users.add(new User(name, surname, email));
                        }

Pozniej jak bedziesz zapisywal do bazy danych to dane bedziesz wyciagal z obiektu user, tyle :)

0

Bardzo dziękuje Swr, twoja pomoc była bardzo przydatna i dzięki niej zrozumiałem lepiej działanie iteratora w kolekcjach.

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