Metoda getValue we własnej implementacji listy jednokierunkowej

0

Witam stworzyłem sobie listę jednokierunkową, która ma w sobie obiekt klasy Element który wygląda tak

private static final class Element<T>{
		private T value;
		private Element<T> next;
		
		public Element(T value, Element<T> next){
			this.value=value;
			this.next=next;
		}
		
		public Element(T value){
			this(value, null);
			
		}

		public T getValue() {
			return value;
		}

		public Element<T> getNext() {
			return next;
		}

		public void setValue(T value) {
			this.value = value;
		}

		public void setNext(Element<T> next) {
			this.next = next;
		}
	}

tworzę listę typu Student( ta klasa wygląda tak):

import java.io.Serializable;

public class Student{
	
	private String imie;
	private String nazwisko;
	private String nrAlbumu;
	private float ocena;
	public Student(String imie, String nazwisko, String nrAlbumu, float ocena) {
		this.imie = imie;
		this.nazwisko = nazwisko;
		this.nrAlbumu = nrAlbumu;
		this.ocena = ocena;
	}
	
	
	
	@Override
	public String toString() {
		return "Student [imie=" + imie + ", nazwisko=" + nazwisko + ", nrAlbumu=" + nrAlbumu + ", ocena=" + ocena + "]";
	}

	

	public String getImie() {
		return imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}
	public String getNrAlbumu() {
		return nrAlbumu;
	}
	public float getOcena() {
		return ocena;
	}

	public void setOcena(float ocena) {
		this.ocena = ocena;
	}
	
}

I gdy sobie wywołam metodę z klasy Element<T> getValue to powinna mi ona zwrócić obiekt typu student, a tak się nie dzieje zwraca mi obiekt typu student z wywołaną metodą toString chociaż ja jej nie wywołuję. Moje pytanie brzmi czemu ta metoda wywołuje się automatycznie? Jak potrzeba jeszcze jakiś kawałek kodu to napiszcie to dodam, nie chciałem zaśmiecać zbędnym kodem. Z góry dziękuję za pomoc :)

0

Pokaż jak wywołujesz to getValue.

0

To jest chyba cała idea metody toString, żeby automatycznie w konsoli prezentować obiekt; Pokombinuj trochę, usuń toString i Zobacz co się stanie, Przetestuj swoją LinkedList dla prostszych typów, Użyj cos ze standartowej biblioteki, jak wszystko zawiedzie Wróć, pomyślimy...

0

Dla typów Integer String działa bo jest to mi potrzebne do metody usuwania obiektu który podam ( nie po indeksie a po obiekcie) jak usunę toString to działa.

	public boolean delete(T o) {
		// TODO Auto-generated method stub
		Element<T> old=headAndTail.getNext();
		while (old != headAndTail && !old.getValue().equals(o)){
			old=old.getNext();
		}
		if (old!=headAndTail){
			old.delete();
			--size;
			return true;
		}
		else return false;
	}

Czyli toString wywołuje się automatycznie jeśli jest przesłonięty?

0

Metoda toString jest zawsze wywoływana, jak nie Przysłonisz swoją to to jest wołana z klasy System . Trzeba jakoś obiekt światu zaprezentować, bo tak naprawdę to jest to zbiór bitów w pamięci.

0
Masterpc96 napisał(a):

Oki. Zamiast obiekty student dam Integer wtedy działa to jak wygląda metoda toString w Integeru? Tak samo tylko nie zwraca String a Integer?

Generalnie wszystko, co Widzisz to String - bo przecież czytamy tylko znaki. Czyli pisząc w programie println(1), widzimy wydrukowany znak "1", który reprezentuje liczbę (typ Integer).

0

Kurczę wczoraj działało jak usunąłem toString() z klasy student a dziś lipa, mógłbyś zerknąć :)
Klasa student



public class Student{
	
	private String imie;
	private String nazwisko;
	private String nrAlbumu;
	private float ocena;
	public Student(String imie, String nazwisko, String nrAlbumu, float ocena) {
		this.imie = imie;
		this.nazwisko = nazwisko;
		this.nrAlbumu = nrAlbumu;
		this.ocena = ocena;
	}
	
	
	
	public String wypiszDane() {
		return "Student [imie=" + imie + ", nazwisko=" + nazwisko + ", nrAlbumu=" + nrAlbumu + ", ocena=" + ocena + "]";
	}

	

	public String getImie() {
		return imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}
	public String getNrAlbumu() {
		return nrAlbumu;
	}
	public float getOcena() {
		return ocena;
	}

	public void setOcena(float ocena) {
		this.ocena = ocena;
	}
	
}

LinkedList metoda delete(T o)

	public boolean delete(T o) {
		// TODO Auto-generated method stub
	        if(first.getNext() == null) return false;
	        if(first.getNext().getValue().equals(o)){
	            first.setNext(first.getNext().getNext());
	            size--;
	            return true;
	        }
	 
	        Element<T> delete = first.getNext();
	        while(delete != null && delete.getNext() != null){
	            if(delete.getNext().getValue().equals(o)){
	                delete.setNext(delete.getNext().getNext());
	                                size--;
	                return true;
	            }
	            delete = delete.getNext();
	        }
	        return false;	 
	}

Klasa testowa

public class Test {
	public static void main (String args[]){
		LinkedList<Student> lista=new LinkedList<Student>();
		lista.add(new Student("MARIA","CIESLEWICZ","003833",5.0f));
		lista.add(new Student("WITOLD","RAJCA","023487",4.0f));
		lista.add(new Student("WIKTOR","ZUROWSKI","025886",2.0f));
		lista.add(new Student("LUKASZ","DWORACZEK","032551",4.0f));
		lista.add(new Student("MIROSLAW","JANICKI","05203",2.0f));
		

	System.out.println("Przed usunięciem");
		for (int i=0;i<lista.size();i++){
			System.out.println(lista.get(i).wypiszDane());
		}
		Student s=new Student("WITOLD","RAJCA","023487",4.0f);
		System.out.println(lista.delete(s));
		System.out.println("\nPo usunięciu");
		for (int i=0;i<lista.size();i++){
			System.out.println(lista.get(i).wypiszDane());
		}
}
0

Zmieniłeś coś w klasie, w metodzie delete pojawia się widzę wskaźnik do first, a w Elemencie nie jest zaimplementowany - więc Twojej listy skompilować sie nie da.
Nie działa wyrzucanie obiektu (remove(Object)) z biblioteki standartowej (remove zwraca false), ponieważ nie da się go znaleźć - nie Masz, teraz zaś w klasie Student, równości. To znaczy metoda sobie iteruje po liście, ogląda obiekty i porównuje je z obiektem, który ma podany, ale nie ma predykatu, znaczy ma jakiś odziedziczony, ale jak widać nie działa. Java nie wywala teraz błędu - uznaje, że to jest to o co Ci chodzi.
Edit:
Ten kod jest nieskomplikowany, mogę go wrzucić (dołóż to do klasy Student, to będzie działać z Listą z biblioteki):

    @Override
    public boolean equals(Object thatObject) {
    	if (!(thatObject instanceof Student)) return false;
    	Student that = (Student) thatObject;
    	return (this.getImie() == that.getImie() && this.getNazwisko() == that.getNazwisko() && 
    			this.getNrAlbumu() == that.getNrAlbumu() && this.getOcena() == that.getOcena());
    }
0

czyli muszę porówna każdy element osobno

0

Co znaczy, że Musisz porównywać każdy element osobno? Nadpisjujemy metodę equals, żeby mieć możliwość porównywania obiektów, to jest sprawdzania czy są takie same. Dwa obiekty klasy student są takie same, gdy zgadza się nawisko, imie, nr albumu i ocena - tak przynajmniej założyłem, dla mnie ma to sens; Możesz przyjąć, np., że oceny nie musza być takie same, a dalej mamy tego samego studenta, whatever, jak sobie Ustalisz będzie OK, dopóki equals będzie zwracać boolean.

0

a nie zobaczyłem że nadpisujesz klasę equals

0

Yhm, metodę equals - jesli chodzi o ścisłść, tu jest wszystko ładnie opisane.

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