Metoda getValue we własnej implementacji listy jednokierunkowej

Odpowiedz Nowy wątek
2017-03-20 23:12
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 :)

Pozostało 580 znaków

2017-03-20 23:40
0

Pokaż jak wywołujesz to getValue.


Pozostało 580 znaków

2017-03-21 02:08
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...


Pozostało 580 znaków

2017-03-21 10:12
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?

Pozostało 580 znaków

2017-03-21 11:19
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.


edytowany 3x, ostatnio: lion137, 2017-03-21 11:21

Pozostało 580 znaków

2017-03-21 12:50
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).


edytowany 2x, ostatnio: lion137, 2017-03-21 13:49

Pozostało 580 znaków

2017-03-21 13:36
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());
        }
}

Pozostało 580 znaków

2017-03-22 00:27

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());
    }

edytowany 5x, ostatnio: lion137, 2017-03-22 01:22

Pozostało 580 znaków

2017-03-22 13:12
0

czyli muszę porówna każdy element osobno

Pozostało 580 znaków

2017-03-22 13:22
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.


edytowany 1x, ostatnio: lion137, 2017-03-22 13:23

Pozostało 580 znaków

2017-03-22 14:06
0

a nie zobaczyłem że nadpisujesz klasę equals

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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