Wyświetlanie listy obiektów

0

Witam
Mam problem z wyświetleniem zawartości listy po jej wczytaniu z klawiatury, co tutaj jest nie tak? Mogę prosić o jakieś wskazówki?
Kompiluje i wczytuje się dobrze, problem tkwi gdzieś w wyświetlaniu zawartości listy,

package kdk;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class Kot {
	static Scanner input = new Scanner(System.in);
	static KotDAO kotDao = new KotDAO();
	private String imie;
	private String opiekun;
	private float waga;
	private Date data;
	public String menu;
	

	public Date getData() {
		return data;
	}

	public double getWaga() {
		return waga;
	}

	public String getImie() {
		return imie;
	}


	public void setImie(String imie) {
		this.imie = imie;
	}


	public String getOpiekun() {
		return opiekun;
	}


	public void setOpiekun(String opiekun) {
		this.opiekun = opiekun;
	}
	public static String getUserInput() {
        return input.nextLine().trim();
    }
	@Override
	public String toString() {
	    return "Imie: " + this.getImie() +" ,opiekun: "+this.getOpiekun()
	    		+ " ,data: "+this.getData() +" ,waga: "+this.getWaga();
	}
	public static void dodajKoty(){
		Kot kot = new Kot();
		System.out.println("imi");
		kot.setImie(getUserInput());
		System.out.println("op");
		kot.setOpiekun(getUserInput());
		System.out.println("dat");
		Scanner input = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
		
		do{
		try {
			System.out.println("Podaj date: ");
		    kot.data = sdf.parse(input.nextLine());
		} catch (ParseException pe) {
		    System.out.println("err3");
		}
		}while(kot.data==null);
		System.out.println("wag");
		boolean done=false;
		kot.waga=0;
		while(done==false){
			try {
				System.out.println("Podaj wage: ");
				kot.waga = input.nextFloat();
				done=true;
				
			} catch (Exception pe) {
				System.out.println("err3");
				input.nextLine();						
			}
		}

		
	}
	private static void pokazKoty(){
		Kot kot;
		
		for (int i=0; i<kotDao.getKoty().size(); i++) {
			kot = kotDao.getKoty().get(i);
			System.out.println(i + ": " + kot.getImie());
		}
	}
	
	public static void menu(){
		
		
		System.out.println("MENU");
		System.out.println("1 - dodaj");
		System.out.println("2 - pokaz");
		System.out.println("x - zamknij");
		
		
	}


	
	public static void main(String[] args) {
		

		String menu;
		do{
			
		menu();
		
		
		menu=input.nextLine();
		
		
		if (menu.matches("1")){
			
			
			dodajKoty();
		}
		if (menu.matches("2")){
			pokazKoty();
		
		}

		
		
		
	 } while (menu != "3");
		
	

	}

}


package kdk;

import java.util.ArrayList;
import java.util.List;

public class KotDAO {
List<Kot> koty = new ArrayList<Kot>();
	
	public void dodajKota(Kot kot) {
		
		koty.add(kot);
		System.out.println("kot w kolekcji");
		
	}
	public List<Kot> getKoty() {
		return koty;
	}

		
		
	
	
	

}


0

Odpal debugger i sprawdź. Osoby nieznające obsługi debuggera, powinny mieć zakaz programowania.

0

Jak dla mnie to tworzysz obiekt Kot, nadajesz mu jego parametry ale nigdzie go do listy nie dodajesz tzn. nie robisz czegoś w stylu kotDao.dodajKota(kot) i tym samym lista przez którą próbujesz się przemieszczać jest pusta.

Zresztą jestem pewny, że gdzieś już widziałem podobny kod więc jest to pewnie z jakiegoś tutoriala. Najłatwiej prześledź go raz jeszcze linia po lini z tłumaczeniem sobie co robisz

0

Tak, rzeczywiście przypadkiem chyba została wycięta jedna linijka, dzięki za pomoc.
Ogólnie podejście jest dobre jeżeli chce się przetrzymywać w liście wiele obiektów(o kilku polach każdy)? Koniecznie wymagana jest do tego druga klasa dao?
W przypadku jeśli chciałbym te dane zapisywać i wczytywać z pliku zamysł także byłby taki sam, różnica polegała by tylko w posiadaniu pliku zamiast listy?

0

Tak, nic nie stoi na przeszkodzie byś w kolekcji trzymał obiekty. Co do DAO to jest ono mile widziane a wręcz niezbędne jak mówimy o czystym kodzie. Ogólnie dao służy do zapewnienia jednolitego interfejsu do komunikacji między aplikacją a źródłem danych (czyli Twoją listą). Dzięki DAO aplikacja nie musi znać sposobu/miejsca ostatecznego zapisu danych. Czyli Ty robisz sobie kotDao.dodajKota(kot) i wiesz, że dodasz tego kota nie zastanawiając się co dokładnie dzieje się w tym kotDAO (czy zapisujesz do listy, pliku, bazy itp). Co do trzeciego chodzi Ci pewnie o coś co zwie się serializacja i znajdziesz o tym wiele informacji. Koniec końców i tak gdzieś te obiekty wczytane musisz trzymać więc i tak stworzyłbyś listę i do niej wczytał te obiekty z pliku

0

Rozumiem, czyli tutaj jest gorsze podejście? Swoją drogą próbowałem tutaj zapisać wszystko do txt poprzez out.writeObject(lista), plik się tworzy, jednak zawiera dużo niepotrzebnych śmieci, co zrobić aby zapisać i później odczytać tylko właściwe informacje?

package schronisko;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class schronisko {
	static int max=10;
	static Scanner input = new Scanner(System.in);
	static List<zwierze> lista = new ArrayList<zwierze>();
	public static String getUserInput() {
        return input.nextLine().trim();
    }
	public static void dodajZwierze(){
		zwierze zwrz = new zwierze();
		System.out.println("Imie: ");zwrz.imie=getUserInput();
		System.out.println("rasa: ");zwrz.rasa=getUserInput();
		System.out.println("data: ");zwrz.data=Integer.parseInt(getUserInput());
		System.out.println("plec: ");zwrz.plec=getUserInput();
		lista.add(zwrz);
		System.out.println("dodano! ");
	}
	public static void pokazZwierzeta(){
		for(int i=0; i < lista.size(); i++) {
			System.out.println(lista.get(i));
		}
        try {
            System.out.println("Zaczynam");
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("a.txt"));
            out.writeObject(lista);
            out.close();
            System.out.println("Skonczylem");
       }
    catch(IOException ioe)
        {
             System.out.println("Error!");
        }
	}
	public static void status(int max){
		System.out.println("Pojemnosc: "+lista.size()+" \\ "+max);
		if (lista.size()<10)
			System.out.println("Miejsce dostepne");
		if (lista.size()==10)
			System.out.println("Pełne");
		}
	public static void usunZwierze(){
		System.out.println("Indeks do usuniecia: ");
		int del=Integer.parseInt(getUserInput());
		lista.remove(del);	
		}
	public static void main(String[] args) {
		String menu="0";
		do{			
			System.out.println("1 - dodaj");
			System.out.println("2 - pokaz");
			System.out.println("3 - usun");
			System.out.println("4 - status");
			System.out.println("5 - exit");
			menu = getUserInput();
			if (menu.equals("1"))
				dodajZwierze();
			if (menu.equals("2"))
				pokazZwierzeta();
			if (menu.equals("3"))
				usunZwierze();
			if (menu.equals("4"))
				status(max);
		}while(!(menu.equals("5")));
		input.close();
	}
}

package schronisko;
public class zwierze {
	String imie;
	String rasa;
	int data;
	String plec;
	public String getImie() {
		return imie;
	}
	public void setImie(String imie) {
		this.imie = imie;
	}
	public String getRasa() {
		return rasa;
	}
	public void setRasa(String rasa) {
		this.rasa = rasa;
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public String getPlec() {
		return plec;
	}
	public void setPlec(String plec) {
		this.plec = plec;
	}
	@Override
	public String toString() {
	    return "Imie: " + this.getImie() + ", Rasa: " + this.getRasa() +
	    ", Rok: " + this.getData() + ", Plec: " + this.getPlec();
	}	
}

0

Odczytuj metodą readObject().
Inny sposób - jedyny jeżeli chcesz edytować zapisane dane w jakimś notatniku - to zapisywanie w pętli po kolekcji lista. Wtedy zapisujesz tylko to co chcesz zapisać.

0

Powinieneś rozdzielić na 3 klasy, zwierze (jak masz), to schronisko (choć nazwa nie wskazuję co tam robisz ale ok) i tego main'a powinieneś wywalić to jakiejś trzeciej klasy. (tak aby kod był czytelniejszy). Następnie schronisko powinno mieć interfejs a to co napisałeś to jego implementacja. Czyli:

public interface schroniskoDAO{
 public static void dodajZwierze();
  public static void pokazZwierzeta();
public static void status(int max);
 public static void usunZwierze();
}

a twoją klasę schronisko podmieć na:

public class  schroniskoImpl implements schroniskoDAO(){}

ale to też tylko dla zachowania porządku i czystego kodu. Jak robisz serializacje i chcesz jakiegoś pola nie zapisać to oznaczasz je słowem transient. O samej serializacji możesz poczytać np. tu: http://www.samouczekprogramisty.pl/serializacja-w-jezyku-java/ choć obecnie bardziej popularne jest zapisywanie danych do formatu JSON. Wpisz sobie w google ArrayList to Json a znajdziesz wiele przydatnych informacji. Tu masz przykład z wykorzystanie biblioteki GSON:

ArrayList<Domain> list = new ArrayList<Domain>();
list.add(new Domain());
list.add(new Domain());
list.add(new Domain());
String json = new Gson().toJson(list);
0
package schronisko;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.google.gson.Gson;
import com.google.gson.JsonIOException;

public class  schroniskoImpl implements SchroniskoDAO{

	static Scanner input = new Scanner(System.in);
	static List<zwierze> lista = new ArrayList<zwierze>();
	public static String getUserInput() {
        return input.nextLine().trim();
    }
	public static void dodajZwierze(){
		zwierze zwrz = new zwierze();
		System.out.println("Imie: ");zwrz.imie=getUserInput();
		System.out.println("rasa: ");zwrz.rasa=getUserInput();
		System.out.println("data: ");zwrz.data=Integer.parseInt(getUserInput());
		System.out.println("plec: ");zwrz.plec=getUserInput();
		lista.add(zwrz);
		System.out.println("dodano! ");
	}
	public static void pokazZwierzeta() throws IOException{

			String json = new Gson().toJson(lista);
			System.out.println(json);
			FileOutputStream f;
			try {
				f = new FileOutputStream(new File("D:\\schr.json"));
				ObjectOutputStream o = new ObjectOutputStream(f);
				o.writeObject(json);
				o.close();
			} catch (FileNotFoundException e) {
				System.out.println("err");
				e.printStackTrace();
			}

			
			

	}
	public static void status(int max){
		System.out.println("Pojemnosc: "+lista.size()+" \\ "+max);
		if (lista.size()<10)
			System.out.println("Miejsce dostepne");
		if (lista.size()==10)
			System.out.println("Pełne");
		}
	public static void usunZwierze(){
		System.out.println("Indeks do usuniecia: ");
		int del=Integer.parseInt(getUserInput());
		lista.remove(del);	
		}
	
}


Po zapisaniu do json można plik normalnie odczytać w notatniku? Zapisując w ten sposób i otwierając plik widzę same krzaki, może je importować z powrotem do programu czy coś jest nie tak, a w notatniku powinien być tekst przyjazny człowiekowi?

0

Tak, plik ten powinien być bezproblemowy do odczytania (zobacz sobie jak wygląda zapis JSON). Powiedz czemu lista jest static ?? Rozumiem, że metoda pokazZwierzeta() to tak na prawdę zapiszZwierzeta() ?? Teraz tak

//do Json ; 
List<Animal> list = new ArrayList<Animal>();
String json = new Gson().toJson(list);
// z Json do ArrayList
ArrayList<Animal> fromJson = new Gson().fromJson(json,  new TypeToken<ArrayList<Animal>>() {}.getType());
//zapis do pliku
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("animals.json")));
out.writeObject(json);
out.close();
//bądź 
FileWriter fileWriter = new FileWriter(new File("plik.json"));
fileWriter.write(json);;
fileWriter.close();

Obie metody zapisu działają u mnie bez problemu, plik można otworzyć i przeczytać

0

Dobra, zapisywanie działa, wielkie dzięki za pomoc.
Teraz kwestia odczytywania

ArrayList<Animal> fromJson = new Gson().fromJson(json,  new TypeToken<ArrayList<Animal>>() {}.getType());

Nie rozumiem dokładnie tej linijki, muszę zawartość pliku wczytać do obiektu json? Co z obiektywem fromJson? Co w nim się znajduje?
Przepraszam za tak banalne pytania dla Was, ale robię sobie taki mały projekt i naprawdę dopiero zaczynam programowanie więc nie do końca wszystko jest zrozumiałe :)

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