Zavolanie metody s parametrom.

Programovacie jazyky, rady, poradňa...
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Zadravím,
rád by som vedel či je nejakým sposobom možné zavolať metodu ktorá nadobuda nejaký paramater.

Konkrétne mám triedu Library :

Kód: Vybrať všetko

import java.util.Scanner;
public class Library {
    java.util.ArrayList<Book> books;
    private static Scanner aKlav = new Scanner(System.in);


    public Library(String libraryAddress) {
        address = libraryAddress;
        books = new java.util.ArrayList<Book>();
                
        boolean koniec = false;
                
        //cyklus pre pracu s bazarom
        do {
            vypisMenu();
            System.out.println("Vyberte si z uvedenej ponuky cinnosti");
            vybrane =  aKlav.nextInt();

            aKlav.nextLine();      
            switch (vybrane) { 
                case 1: //vypis bazara
                    printAvailableBooks(); 
                    break;

                case 2: 
                    
                    break; 

                
                
                default ://zle zadane cislo
                    System.out.println("Taketo cislo v ponuke nebolo , vyberte si znova!");
                    break;
            } //koniec switch         
        }  //koniec do
        while (!koniec );
      
        //ukoncenie prace
        System.out.println();
        System.out.println("Aplikacia uz bohuzial konci!");
     
    }

    public void addBook(Book book) {
        books.add(book);
    } 

    public void printAvailableBooks() {
        boolean bookPresent = false;
        for (Book book : books) {
            if (!book.isBorrowed()) {
                System.out.println(book.getTitle());
                bookPresent = true;
            }
        }
        
        if (!bookPresent) {
            System.out.println("No book in catalog");
        }
    }

    
    public static void vypisMenu() {
        System.out.println();   
        System.out.println("Ponuka moznosti:");  
        System.out.println("******************************************************************************************");
        System.out.println("1-Zoznam knih v knižnici");
        System.out.println("2-Pridaj knihu");
        System.out.println("******************************************************************************************");

    }   
} 
a triedu Book :

Kód: Vybrať všetko

public class Book {

    String title;
    boolean borrowed;

    public Book(String bookTitle) {
        title = bookTitle;
        borrowed = false;
    }
   

    public void borrowed() {
        borrowed = true;
    }

    public void rented() {
        borrowed = true;
    }

    public void returned() {
        borrowed = false;
    }
   

    public boolean isBorrowed() {
        return borrowed;
    }
   

    public String getTitle() {
        return title;
    }


} 
A v triede Library by som chcel v switchi zavolať triedu addBook, ktorá však ma parameter typu Book.
Je to nejakým spôsobom možné ?

Diky
94jakub
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2037
Registrovaný: 15 dec 2006, 13:18
Bydlisko: Martin/BA
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa 94jakub »

Kód: Vybrať všetko

Book b = new Book("Nauč sa Javu");
addBook(b);
A ten kód na menu, čo máš v konštruktore tam nemá, čo robiť Vytvori si main funkciu(najlepšie v inej triede aj s celým menu) a daj to tam.
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

..
94jakub
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2037
Registrovaný: 15 dec 2006, 13:18
Bydlisko: Martin/BA
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa 94jakub »

A ako pridávaš tú knihu? Voláš metódu, ktorá pridáva knihu do zoznamu.

Neviem, čo rozumieš pod zložitejšími metódami. Možno je problém preto, že to máš zle spravené a menu máš mať v inej triede, možno len úplne nechápeš OOP.
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

//Ano v tom prípade to bola pravda, zle som si prečítal kód.

Ale problem nastáva napríklad tu (Kde novú triedu Book nevytváram):
Tak už naprikald pri mazaní knihy.

Kód: Vybrať všetko

case "c":
                        System.out.println("Napíšte ktorú knihu chcete odobrať");                
                        removeBook = remBook.nextLine();
                        this.library.removeBoook(removeBook);
                       
                        
                        break; 

Kód: Vybrať všetko

    public void removeBook(Book book) {
              
       books.remove(book);

    }
Akým spôosobom je možné knihu odobrať, kedže odoberKnihu je parametru String a nie Book?
94jakub
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2037
Registrovaný: 15 dec 2006, 13:18
Bydlisko: Martin/BA
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa 94jakub »

No tak skús porozmýšľať, prečo to nejde. Keď máš zoznam objektov typu Book a chceš vymazať podľa názvu(String), tak musíš nájsť v tom zozname objekt(knihu), ktorého názov sa rovná tomu požadovanému stringu.

Zložitejšia možnosť je vytvoriť pred volaním removeBook() objekt Book s názvom, ktorý chceš vymazať a do objektu Book implementovať funkciu equals(). Potom môžeš do removeBook posielať rovno objekt Book. Tu trocha aj odo mňa otázka na iných, pri vlastných triedach ako sa vlastne defaultne správa equals?
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa harrison314 »

94jakub napísal:Zložitejšia možnosť je vytvoriť pred volaním removeBook() objekt Book s názvom, ktorý chceš vymazať a do objektu Book implementovať funkciu equals(). Potom môžeš do removeBook posielať rovno objekt Book. Tu trocha aj odo mňa otázka na iných, pri vlastných triedach ako sa vlastne defaultne správa equals?
Myslim, ze sa v takom pripade porovava iba referencia.
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Pokusil som sa o to foreachom ktorý prejde všetký knihy v liste books.
Avšak zda sa že to akosi nefunguje, robím to uplne zle alebo som is len niečoho nevšimol ?

Kód: Vybrať všetko

                case "c":
                        System.out.println("Napíšte ktorú knihu chcete odobrať");                
                        odoberKnihu = removeBook.nextLine();
                        Book odober= new Book(odoberKnihu);
                                
                                for (Book book : library.books) {
                                    if (book.getTitle().equals(odober)) {
                                        this.library.removeBook(book);
                                    } else {
                                        System.out.println("kniha nexistuje");                
                                  }
                    
                                }
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Zavolanie metody s parametrom.

Príspevok od používateľa mirak2 »

robis to uplne zle. snaz sa pochopit, co tam vlastne pises. mas nazov knihy zadany uzivatelom, vytvoris knihu s takym nazvom a ides po jednom porovnat nazov kazdej knihy s knihou. ked porovnavas, porovnavaj nazov s nazvom a nie nazov s knihou.

Kód: Vybrať všetko

if (book.getTitle().equals(odoberKnihu)) {
a zopakujem to pre istotu este raz: davaj premennym normalne nazvy. dobry priklad na nazov premennej odoberKnihu je nazovOdstranovanejKnihy.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa audiotrack »

síce nie som javista (neviem ako tam funguje porovnávanie objektov) ale nie je obecne lepšie porovnávať objekty odober a book? Spoliehať sa na názvy nie je jednoznačné, viď: http://www.martinus.sk/?uItem=212354 a http://www.martinus.sk/?uItem=148364 .

i keď v tom jeho návrhu je to to isté, ale mám taký zlý pocit že jedného dňa príde s porovnávaním dvoch objektov cez všetky jeho atributy s nejakými napevno vpísanými reťazcami (napríklad namiesto toho aby porovnal objekt s nejakým emptyObjektom bude prechádzať všekty atribúty či majú default hodnotu)
aacid
Hardcore addict
Hardcore addict
Príspevky: 8136
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: Zavolanie metody s parametrom.

Príspevok od používateľa aacid »

urcite to lepsie je, ale je velka hromada veci ktora by sa dala zlepsit v tomto kode :)
kniha by mala mat jednoznacny identifikator, podla ktore by si medzi nimi hladal a porovnaval...

tiez mi to nepride moc oop, funkcionalita menu by mala byt oddelena od funkcionality kniznice. no a neuveritelne ma skrie ze ma nekonecny cyklus v konstruktore (ktory aktualne ozaj nejde ukoncit).
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Zatial približne rozumiem kde som robil chyby.

Podarilo sa mi vyprodukovať niečo takéto :

Kód: Vybrať všetko

                case "b": 
                        System.out.println("Napíšte názov knihy ktorú chcete pridať");
                        nazovPridavanejKnihy = Book.nextLine();
                        Book pridaj = new Kniha(nazovPridavanejKnihy);
                        this.library.books.add(pridaj);
                        break; 

                case "c":
                        System.out.println("Napíšte ktorú knihu chcete odobrať");                
                        nazovOdstranovanejKnihy = odoberKniha.nextLine();

            
                                for (Kniha book : this.library.books) {
                                  
                                    if (book.getTitle().equals(nazovOdstranovanejKnihy)) {
                                        this.library.books.remove(book);
                                    } else  {    
                                        System.out.println("kniha nexistuje");                
                                  }
                    
                                }
Pri druhom pokuse o zmazanie mi vypíše chyby že array list je prazdny.
Ak tomu správne chápem tak vo foreache priradím book triedy Book celý Array List books z inštancie library u ktorého potom zistujem rovnosť.
Avšak nerozumiem prečo si program pri druhom odstranovaní myslí že Array List je prazdny :/
94jakub
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2037
Registrovaný: 15 dec 2006, 13:18
Bydlisko: Martin/BA
Kontaktovať používateľa:

Re: Zavolanie metody s parametrom.

Príspevok od používateľa 94jakub »

Tiež myslím, že by bolo lepšie porovnávať dva objekty. Na to by bolo asi dobré spraviť identifikátory a svoj equals.
Alebo ich neporovnávať ale nájsť v zozname jeden podľa názvu(ak ich je viac zhodných, tak nejakým spôsobom vybrať jeden) a potom ten vybraný vymazať.

Máš v tom liste viac kníh? Ten else pri porovnávaní je tiež zle, lebo ak sa nerovnajú, tak to neznamená, že neexistuje akurát tie dve porovnávané sa nezhodujú.
Ak som tvojej vete pochopil správne tak, nie. vo foreach v každej iterácii premennej book priradíš jeden z prvkov zoznamu a postupne ho prejdeš celý.

Ako vôbec program spúštaš? Prečo nemá menu tam kde je main() ?

Nekonečný cyklus som si ani nevšimol. :) Tfuj. Daj si tam aspoň ešte jeden case, v ktorom nastav koniec na true.
aacid
Hardcore addict
Hardcore addict
Príspevky: 8136
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: Zavolanie metody s parametrom.

Príspevok od používateľa aacid »

Kkasino a debugoval si to?
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Máš v tom liste viac kníh? Ten else pri porovnávaní je tiež zle, lebo ak sa nerovnajú, tak to neznamená, že neexistuje akurát tie dve porovnávané sa nezhodujú.
Ak som tvojej vete pochopil správne tak, nie. vo foreach v každej iterácii premennej book priradíš jeden z prvkov zoznamu a postupne ho prejdeš celý.
[/quote]

Else by mal byť spravny nie ? Kedže foreach prechádza každú knihu a porovná ju s mojim retazcom. Tym pádom ak ani v jednom prechode cyklu foreach nenajde zhodnu kniha neexistuje nie ?

Ako vôbec program spúštaš? Prečo nemá menu tam kde je main() ?

Nekonečný cyklus som si ani nevšimol. :) Tfuj. Daj si tam aspoň ešte jeden case, v ktorom nastav koniec na true.
To som len vycucol kde mi program vyhodil chybu. Račej sem hodím celý kod všetkých tried (premenne/trieda Book su rozdielne pomenované od minulého kódu) :

Trieda Kniha :

Kód: Vybrať všetko

public class Kniha {

    String title;
    boolean borrowed;

    public Kniha(String bookTitle) {
        title = bookTitle;
        borrowed = false;
    }
   

    public void borrowed() {
        borrowed = true;
    }

    public void rented() {
        borrowed = true;
    }

    public void returned() {
        borrowed = false;
    }

    public boolean isBorrowed() {
        return borrowed;
    }
   

    public String getTitle() {
        return title;
    }

} 
Triedna Library :

Kód: Vybrať všetko

 import java.util.Scanner;
public class Library {
    
    public static java.util.ArrayList<Kniha> books;
    private static Scanner aKlav = new Scanner(System.in);

    public static final String openTime = "9am";
    public static final String closeTime = "5pm";

    public Library() {
        
        books = new java.util.ArrayList<Kniha>();               

    }
   
    public static void pozicajKnihu(Kniha title) {
        int found = 0;
        for (Kniha book : books) {
            if (book.getTitle().equals(title)) {
                if (found == 0) {
                    found = 1;
                    }
                if (!book.isBorrowed()) {
                    book.borrowed();
                    found = 2;
                    break;
                };
            }
        }
        if (found == 0) {
            System.out.println("Sorry, this book is not in our catalog.");
        } else if (found == 1) {
            System.out.println("Sorry, this book is already borrowed.");
        } else if (found == 2) {
            System.out.println("You successfully borrowed " + title);
        }
    }
        
    public void pridajBook(Kniha book) {
              
       books.add(book);
    }
    
    public void odoberKnihu(Kniha book) {
              
       books.remove(book);

    }

    public static void printOpeningHours() {
        System.out.println("Libraries are open daily from " + openTime + " to " + closeTime);
    }

    public static void printAvailableBooks() {
        boolean bookPresent = false;
        for (Kniha book : books) {
            if (!book.isBorrowed()) {
                System.out.println(book.getTitle());
                bookPresent = true;
            }
        }
        
        if (!bookPresent) {
            System.out.println("No book in catalog");
        }
    }

    public void returnBook(String title) {
        boolean found = false;
        for (Kniha book : books) {
            if (book.getTitle().equals(title) && book.isBorrowed()) {
                book.returned();
                found = true;
                break;
            }
        }
        if (found) {
           System.out.println("You successfully returned " + title);
        }
    }
} 
a trieda Menu :

Kód: Vybrať všetko

 import java.util.Scanner;
public class Menu {
    private Library library;
    

    private  Scanner aKlav = new Scanner(System.in);
    private  Scanner Kniha = new Scanner(System.in);
    private  Scanner odoberKniha = new Scanner(System.in);
    private  Scanner pozKnihy = new Scanner(System.in);

    public Menu() {
        boolean koniec = false;
        String vybrane = "";
        this.library = new Library();
        String pridajKnihu = "";
        String nazovOdstranovanejKnihy = "";
        String pozicajKnihu;

        do {
            
            vypisMenu();
            System.out.println("Vyberte si z uvedenej ponuky cinnosti");
            vybrane =  aKlav.nextLine();

            switch (vybrane) { 
                case "a" : 
                        this.library.printAvailableBooks(); 
                        break;

                case "b": 
                        System.out.println("Napíšte názov knihy ktorú chcete pridať");
                        pridajKnihu = Kniha.nextLine();
                        Kniha pridaj = new Kniha(pridajKnihu);
                        this.library.books.add(pridaj);
                        break; 

                case "c":
                        System.out.println("Napíšte ktorú knihu chcete odobrať");                
                        nazovOdstranovanejKnihy = odoberKniha.nextLine();

            
                                for (Kniha book : this.library.books) {
                                  
                                    if (book.getTitle().equals(nazovOdstranovanejKnihy)) {
                                        this.library.books.remove(book);
                                    } else  {    
                                        System.out.println("kniha nexistuje");                
                                  }
                    
                                }
                                
                        break; 
                
                
                        default ://zle zadane cislo
                    System.out.println("Takýto znak v ponuke nebol");
                    break;
            } //koniec switch         
        } while (!koniec );
      
        //ukoncenie prace
        System.out.println();
        System.out.println("Aplikacia uz bohuzial konci!");

    }
    public  void vypisMenu() {
        System.out.println();   
        System.out.println("Ponuka moznosti:");  
        System.out.println("******************************************************************************************");
        System.out.println("a, Zoznam kníh v knižnici");
        System.out.println("b, Pridaj knihu do knižnice");
        System.out.println("c, Odober auto z knižnice");
        System.out.println("0-Koniec");
        System.out.println("******************************************************************************************");
    }   
}
//Program bol povodne autobazár
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Zavolanie metody s parametrom.

Príspevok od používateľa mirak2 »

v prvom rade som chcel poukazat na to, ze nemoze porovnavat nazov knihy s nejakou knihou ako takou.
btw toto je pecka, od dnes v knizniciach uz aj auta! :lol:

Kód: Vybrať všetko

System.out.println("a, Zoznam kníh v knižnici");
        System.out.println("b, Pridaj knihu do knižnice");
        System.out.println("c, Odober auto z knižnice");
PS: cim skor zacnes a naucis sa debugovat, ist krok po kroku, riadok po riadku, tym skor pochopis, co to vlastne robi a ma robit.
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Vidim ze ideálne bude si predtým nez budem robit čokoľvek ine, poriadne prejst a prečistít kod.
aacid
Hardcore addict
Hardcore addict
Príspevky: 8136
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: Zavolanie metody s parametrom.

Príspevok od používateľa aacid »

v com robis? predpokladam ze v eclipse.

pozri tutorial ako debugovat, fakt je to neocenitelna vec pri programovani, hlavne ak sa ucis, mozes krasne vidiet ako tvoj program pracuje krok po kroku a teda velmi lahko zbadas kde je neico zle.

http://www.vogella.com/tutorials/Eclips ... ticle.html
Kkasino
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 232
Registrovaný: 07 júl 2010, 17:36

Re: Zavolanie metody s parametrom.

Príspevok od používateľa Kkasino »

Robím to v BlueJ ale diky, minimalne vyskúšam.
aacid
Hardcore addict
Hardcore addict
Príspevky: 8136
Registrovaný: 22 nov 2006, 21:55
Bydlisko: BA

Re: Zavolanie metody s parametrom.

Príspevok od používateľa aacid »

Napísať odpoveď