Reklama
Pokazuje wyniki od 1 do 6 z 6

Temat: [JAVA] Tablica obiektów oraz zliczanie obiektów

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny [JAVA] Tablica obiektów oraz zliczanie obiektów

    Piszę program, który zawiera klasę Ksiazka i wykonuje kilka operacji jak wyświetlanie, dodawanie nowych książek, itp.


    atrybuty

    Kod:
            private static int staticId = 1;
    	private int id;
    	
    	private String tytul;	
    	private double cena;
    	private int iloscStron;
    konstruktor
    Kod:
    Ksiazka (String t, double c, int i)
    	{
    		tytul = t;
    		cena = c;
    		iloscStron = i;
    		id = staticId++;
    	}
    metoda toString *** Przy okazji, czemu służy Override i po co to w ogóle?
    Kod:
    @Override
    	public String toString() {
    		return "Ksiazka nr " + id + "\nTytul=" + tytul + "\nCena=" + df.format(cena) + " zł" + "\nIlosc Stron="
    				+ iloscStron;
    	}

    1. W main tworzę klika obiektów i je wyświetlam, atrybut ID mówi o ilości utworzonych książek. Tutaj mam w sumie tylko pytanie..
    -staticId wynosi 0
    -tworzę pierwszy obiekt (id = staticId++ czyli id = 0+1 czyli id powinno równać się 1)
    -a jednak gdy wyświetlam książki to numeruje mi je od 0

    -gdy staticId ustawie na 1 to jest dobrze, daje wyświetlanie książek i leci książka nr 1, 2, 3 itd.

    Czego tu nie rozumiem? Co jest błędnego w moim pierwszym rozumowaniu, a co czyni drugie poprawnym?



    2. Drugi problem dotyczy tablicy obiektów. W programie chcę by można było swobodnie dodawać, usuwać książki. Jak mam jednak to zrobić, skoro muszę nadać tablicy przy tworzeniu rozmiar?

    Kod:
    Ksiazka[] ksiazki = new Ksiazka[4];
    		ksiazki[0] = new Ksiazka();
    		ksiazki[1] = new Ksiazka();
    		ksiazki[2] = new Ksiazka();
    		ksiazki[3] = new Ksiazka("Potop", 49.99, 540);
    				
    		ksiazki[1].wprowadzLosowo(sc);				
    		ksiazki[2].wprowadz(sc);
    Jak z takiego czegoś przejść do możliwości operowania na tej tablicy podczas działania programu, tzn. dodawanie, wyświetlanie, usuwanie obiektów.
    Jedyne co mi przychodzi do głowy to użycie tego licznika i na jego podstawie tworzenie nowych tablic w main'ie... ale może jest bardziej elegancki sposób? Dodam iż wymogiem jest tutaj tablica, nie żadna inna kolekcja. No i oczywiście nie chodzi mi o napisanie za mnie całego kodu, a jednie naprowadznie mnie na odpowiedni sposób.
    Ostatnio zmieniony przez hefalump : 17-11-2016, 14:41

  2. #2
    Avatar Terr
    Data rejestracji
    2004
    Położenie
    Venore
    Posty
    1,993
    Siła reputacji
    22

    Domyślny

    1. http://stackoverflow.com/questions/5...de-for-in-java
    adnotacja override sprawdza czy faktycznie nadpisujesz jakąś metode (w tym wypadku nadpisujesz toString() z klasy Object, bo kazdy obiekt w Javie dziedziczy po Object)

    @Override creates a compile-time check that a method is being overridden.
    It not only makes the compiler check - although that would be enough to make it useful; it also documents the developer's intention.

    For instance, if you override a method but don't use it anywhere from the type itself, someone coming to the code later may wonder why on earth it's there. The annotation explains its purpose.
    czyli teoretycznie nie trzeba jej używać - ale to okropna praktyka i masz jej używać w kazdym miejscu w którym coś nadpisujesz

    2. http://stackoverflow.com/questions/4...nd-i-in-a-loop
    jest różnica czy zapiszesz ++staticId czy staticId++, taka o:

    a++ is known as postfix.

    add 1 to a, returns the old value.

    ++a is known as prefix.

    add 1 to a, returns the new value.
    faktycznie robisz w konstruktorze 0 + 1 ale pod id wstawiasz starą wartość - 0,
    w nastepnej książce robisz 1 + 1 a wstawiasz starą 1
    potem 2 + 1 a wstawiasz 2
    itd.

    3. http://stackoverflow.com/questions/1...ic-array-sizes

    do takich operacji służą właśnie kolekcje w stylu ArrayList, nie wiem dlaczego prowadzący na chama forsuje tablice z których praktycznie nikt nie korzysta, bardzo odradzam takich dziwnych rzeczy, użyj listy/setu i się kłóć


    @hefalump ;
    więcej google, polecam na końcu query wpisać
    site:stackoverflow.com
    żeby szukać od razu na stacku
    Ostatnio zmieniony przez Terr : 17-11-2016, 20:07

  3. Reklama
  4. #3

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Jakoś udało mi się z tymi tablicami powalczyć, teraz robimy coś na kolekcjach i niestety znowu mam problem...


    Kod:
    Vector<Osoba> vector = new Vector();
    KolekcjeView vectorView;
    
    @Override
        public void actionPerformed(ActionEvent e) {        
            String im, nz;
                    Osoba o1;
                    Object source = e.getSource();
     
                    if(source == dodajBtn){
                        im = imieTField.getText();
                        nz = nazwTField.getText();                    
                        o1 = new Osoba(im, nz); 
                        vector.add(o1);
     
                    }
     
                    else if(source == usunBtn){
                        im = imieTField.getText();
                        nz = nazwTField.getText();                    
                        o1 = new Osoba(im, nz);  
                        vector.remove(o1);                 
                        vector.trimToSize();
     
                    }
     
                    else if (source == wyczyscBtn){
                        vector.clear();                    
                    }
     
                    if((source == wyswietlBtn) || (checkBox.isSelected())) {
                        Iterator it;
                        vectorView.clear();
     
                        it = vector.iterator();
                        while(it.hasNext()){
                            o1 = (Osoba)it.next();
                            vectorView.addItem(o1.toString());
                        }
                    }
    Program ma wyświetlać obiekty klasy Osoba (String imie, nazwisko) w kolekcjach (póki co mam tylko vector, w planach zaimplementowanie jeszcze kilku).
    Działa dodawanie obiektu - jeżeli zaznaczony jest checkBox bądź kliknę "wyświetl" a wcześniej "dodaj" to ładnie dodaje mi element do widoku.
    Gdy kliknę "wyczyść" czyści wszystkie elementy.
    Jednak gdy kliknę "usuń" w celu usunięcia konkretnego elementu nie dzieje się nic... jakieś pomysły dlaczego?

    Kod:
    public class KolekcjeView extends JScrollPane{
    	
    	private JList lista;
    	private DefaultListModel modelListy;
    	
    	KolekcjeView(int szer, int wys, String opis){
    		super();
    		modelListy = new DefaultListModel();
    		lista = new JList(modelListy);
    		setViewportView(lista);
    		setPreferredSize(new Dimension(szer, wys));
    		setBorder(BorderFactory.createTitledBorder(opis));
    	}
    	
    	void clear(){
    		modelListy.clear();
    	}
    	
    	void addItem(Object o){
    		modelListy.addElement(o);
    	}      
    }
    klasa odpowiedzialna za wyświetlanie obiektów

    Dodaje rysunek aplikacji
    http://imgur.com/a/ZawUb
    Ostatnio zmieniony przez hefalump : 24-11-2016, 11:08

  5. #4
    Avatar Pietro18
    Data rejestracji
    2005
    Położenie
    Wrocław
    Wiek
    29
    Posty
    867
    Siła reputacji
    20

    Domyślny

    Kod:
    o1 = new Osoba(im, nz);
    vector.remove(o1);
    nie usuwa, bo tworzysz nowy obiekt i próbujesz go usunąć, a jego w ogóle nie ma w Twoim wektorze :P

  6. #5

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Kod:
     else if(source == usunBtn){
                        Iterator it = vector.iterator(); 
                        im = imieTField.getText();
                        nz = nazwTField.getText();
                        while(it.hasNext())
                        {
                            o1 = (Osoba)it.next();
                            if((o1.getImie().equals(im)) && o1.getNazwisko().equals(nz))
                                    {
                                        vector.remove(o1);
                                        vector.trimToSize();
                                    }
                        }

    Coś] takiego wykombinowałem, teoretycznie to działa... ale gdy w vectorze jest tylko 1 obiekt np.
    Jan Kowalski
    muszę kliknąć usuń 2 razy
    bądź usuń i wyświetl (ręcznie, mimo wciśniętego checkbox'a który powinien automatycznie odświeżyć vector)

    gdy dodam np. 5 Janów Kowalskich to od razu po kliknięciu usuń znikają, aż zostanie 1, wtedy muszę kliknąć usuń 2x bądź usuń + wyswietl.

  7. #6
    Avatar Rollercoster
    Data rejestracji
    2011
    Wiek
    29
    Posty
    1,247
    Siła reputacji
    14

    Domyślny

    Cytuj Pietro18 napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Kod:
    o1 = new Osoba(im, nz);
    vector.remove(o1);
    nie usuwa, bo tworzysz nowy obiekt i próbujesz go usunąć, a jego w ogóle nie ma w Twoim wektorze :P
    Gdyby mial nadpisane eqauls i hashcode to by dzialalo. I moim zdaniem tutaj powinien miec.

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Zliczanie w excelu
    Przez 2Fast4You w dziale Programowanie
    Odpowiedzi: 0
    Ostatni post: 13-01-2018, 09:26
  2. [JAVA] Tablica obiektow
    Przez hefalump w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 31-10-2014, 23:24
  3. Odpowiedzi: 10
    Ostatni post: 21-01-2014, 21:19
  4. C-tablica dynamiczna
    Przez Puchałke w dziale Programowanie
    Odpowiedzi: 8
    Ostatni post: 29-09-2013, 23:31
  5. Dynamiczna tablica w C (NIE C++)
    Przez zakius w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 2
    Ostatni post: 19-04-2012, 07:49

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •