Arraylist i wyświetlanie jego elementów

0

Witam. Ćwiczę sobie Arraylisty i mam takie pytanie.

package zad1;

import java.util.ArrayList;

public class Wykladowca {

	private String imie;
	private String nazwisko;
	private String przedmiot;

	public Wykladowca(String imie, String nazwisko, String przedmiot) {
		this.imie = imie;
		this.nazwisko = nazwisko;
		this.przedmiot = przedmiot;
	}

	ArrayList<Wykladowca> wykladowcy = new ArrayList<Wykladowca>();

	public void DodajWykladowce() {
		wykladowcy.add(new Wykladowca(imie, nazwisko, przedmiot));
	}

	public void UsunWykladowce() {
		wykladowcy.remove(wykladowcy);
	}

	public void WyswietlWykladowce() {

		System.out.println(wykladowcy.get(0));

	}

}

i main:

package zad1;

public class Dziekanat {

	public static void main(String[] args) {
		
		Wykladowca wykladowca = new Wykladowca("Michal","Kichal","wf");
		wykladowca.DodajWykladowce();
		wykladowca.WyswietlWykladowce();
	}

}

Co robie źle że nie mogę wyświetlić wykładowcy? Tylko zwraca mi coś w stylu zad1.Wykladowca@19e7ce87

dodanie znacznika `` - furious programming

0

Próbowałem też tak

public void WyswietlWykladowce() {

		//System.out.println(wykladowcy.get(0));
		Wykladowca imie = wykladowcy.get(0); 
		System.out.println("Imie: "+imie);

		
	}
1

Co robie źle

#Nie myslisz. Dlaczego wykladowca ma liste wykladowcow? O.o
#Nie masz wlasnej implementacji toString, wiec jest uzyta implementacja z klasy Object, ktora wyglada jak wyglada.

0

Ok więc jak zmienie:

ArrayList<String> wykladowcy = new ArrayList<String>();

a w metodzie

public void DodajWykladowce() {
		wykladowcy.add(imie,nazwisko,przedmiot);
	}

mi to nie zadzaiala bo bede mogl dodac tylko samo imie. I właśnei się zastanawiam jak to ominąć abym mógł dodać kilka pól z konstruktora.

2

Hm. Programowanie nie polega na losowym dobieraniu ciagu znakow z mysla "moze sie tym razem uda.", tylko na mysleniu. Ale zeby myslec, trzeba miec tez kapke wiedzy, wiec do dziela -> http://docs.oracle.com/javase/tutorial/java/concepts/index.html

0

Dobra poradziłem sobie wstępnie.

Zmieniłem przykład żeby zacząć od nowa.

Zrobiłem klasę osoba z której dziedcziczy mi pracownik i klienta. Oprocz tego beda klasy faktura o raz towar.

Arrayliste tworze w nastepujacy sposob

ArrayList<Osoba> osoby = new ArrayList<Osoba>();
		osoby.add(new Pracownik("Michal", "Michalski"));
		osoby.add(new Klient("Andrzej", "Michalski"));

no i na razie proste wyświetlanie:

 for(int i=0; i< osoby.size(); i++) 
         { 
                 System.out.println(""+osoby.get(i).getImie()+" "+osoby.get(i).getNazwisko()); 
         } 

O to chodziło czy jesz\ze coś nie obiektowo ?

1

Juz lepiej. Poczytaj jeszcze o toString zamiast tego wyswietlania z getterami. A i jeszcze zamiast tego for, poczytaj o alternatywnej skladni do iterowania po calej kolekcji for(T elem : collection) ...

0

foreach znam :D Na razie próbowałem czy będzie coś z tego co napisałem. Mam jeszcze pytanie. Czy w miarę poprawnie jest takie przesłonięcie

metoda w klasie osoba:

public int getNumer() {

		return numer;
	}

a potem coś takiego mam np. w pracowniku:

@Ovveride
	public int getNumer(){
		
		return numer_pracownika;
	}

Oczywiście na razie pomijając to że mam zmienić na

toString

Zanim odpowiedziałeś ogarnąłem sobie toString()

@Override
	public String toString() {

		return "Imie: " + imie + " \nNazwisko: " + nazwisko + "\nNumer pracownika: " + numer_pracownika ;

	}

i podobnie jest w kliencie

natomiast w main tak wyświetlam:

		ArrayList<Osoba> osoby = new ArrayList<Osoba>();
		osoby.add(new Pracownik("Michal", "Michalski", 1));
		osoby.add(new Klient("Andrzej", "Michalski", 2));

		for(Osoba o : osoby){
			System.out.println(o);
			
		}
0

Jeżeli chcesz "wydrukować" jakiś obiekt, a nie chce Ci się/ nie masz czasu/możliwości tworzyć metody toString możesz użyć ToStringBuilder.reflectionToString(Object object) z pakietu commons lang.

0

Panowie a jak pobrać do klasy Faktura w której sobie utworze takie pola:

int numer_faktury;
	String imie_sprzedawcy;
	String nazwisko_sprzedawcy;
	String imie_klienta;
	String nazwisko_klienta;
	String data_wystawienia;

dane z klas Sprzedawca i Klient które dziedziczą po klasie Osoba?

Jeśli dałbym w ten sposób

String imie_sprzedawcy = Sprzedawca.imie;

to wtedy pole imie musi być statyczne co spowoduje że nie będzie działać poprawnie dodawanie do HashSet.

Proszę o naprowadzenie

//edit zmienilem arraylist na hashset ponieważ chciałem pobawić się z eliminacją duplikatami.

2

Najprościej to zmienić definicje klasy Faktura:

    int numer_faktury;
    Sprzedawca sprzedawca;
    Klient klient;
    GregorianCalendar data_wystawienia;
0
bogdans napisał(a):

Najprościej to zmienić definicje klasy Faktura:

    int numer_faktury;
    Sprzedawca sprzedawca;
    Klient klient;
    GregorianCalendar data_wystawienia;

Tak tylko wtedy wykonanie tego:

@Override
	public String toString() {

		return "Imie sprzedawcy: " + pracownik.imie
				+ "\n Nazwisko sprzedawcy: " + pracownik.nazwisko
				+ " \nImie klienta: " + klient.imie + " \nNazwisko klienta: "
				+ klient.nazwisko+ "\n";
	}

da NullPointerException

0

Bo jeszcze musisz napisać odpowiedni konstruktor w klasie Faktura.

1

Ja nie widzę żadnej klasy wewnętrznej. Konstruktor może wyglądać np. tak (jeżeli numeracja faktur jest automatyczna):

public class Faktura
{
    private int numer_faktury;
    private Sprzedawca pracownik;
    private Klient klient;
    private GregorianCalendar data_wystawienia;
    private static int ostatniNumer = 0;
    public Faktura(Sprzedawca pracownik,Klient klient,GregorianCalendar data_wystawienia)
    {
         this.pracownik = pracownik;
         ...
         ostatniNumer++;
         this.numer_faktury = ostatniNumer;
    }
    ...
}
0

No właśnie bo inaczej pomyślałem niż ty napisałeś. Ok tak by to załatwiło sprawę, numer faktury na razie dałem pobierany z konstruktora , ale faktycznie lepszym będzie "automatyczna" numeracja.

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