View Full Version : [Java] Aiuto su metodi
Salve ragazzi...io non ho mai programmato ad oggetti...ho solo visto qualcosina quindi chiedo pietà :)
Devo dare un esame dove è richiesto di conoscere un pò di java e leggendo degli esempi ci sono degli statement un pò complessi per me che non riesco a capire.
Questo codice che sto leggendo riguarda un sistema di gestione bibliotecario di prestito libri e annessi...
leggendo a giro per il codice incontro spesso questi metodi un pò complessi:
premetto che qui siamo all'interno della classe Biblioteca:
public Testo getTesto(String titolo, String autore){
for(Iterator<Testo> i = testi.iterator();i.hasNext();){
Testo testo = (Testo)i.next();
if(testo.getAutore().equalsIgnoreCase(autore) && testo.getTitolo().equalsIgnoreCase(titolo))
return testo;
}
throw new RuntimeException("Testo non presente.");
}
Cioè io non capisco per esempio la condizione in quell'if!
Se ci fosse stato solo : testo.getAutore() allora voleva dire che usavo il metodo getAutore della classe testo ma in questo caso? Come li leggo tutti quei metodi divisi dai punti?
Grazie mille
Ballantine
29-08-2012, 21:21
Se ci fosse stato solo : testo.getAutore() allora voleva dire che usavo il metodo getAutore della classe testo ma in questo caso? Come li leggo tutti quei metodi divisi dai punti?
Stai sempre usando il metodo getAutore() della classe testo. Questo metodo ti restituisce un oggetto di tipo String, e quindi puoi chiamare su di esso un qualsiasi metodo di quella classe, come equalsIgnoreCase().
Una versione "allungata" dello stesso codice è:
...
for(Iterator<Testo> i = testi.iterator();i.hasNext();){
Testo testo = (Testo)i.next();
String autoreTesto = testo.getAutore();
String titoloTesto = testo.getTitolo();
if(autoreTesto.equalsIgnoreCase(autore) && titoloTesto.equalsIgnoreCase(titolo))
return testo;
}
...
Ciao, innanzi tutto grazie x adesso, Solo che non ho capito troppo bene il concetto! Io nella classe testo non ho alcun metodo che si chiama EqualsIgnoreCase().... Nella classe trovo i seguenti metodi:
GetAutore, getEsemplari, getPrenotazioni, getTitolo, addPrenotazione, addEsemplAre!
Edit: ho letto che è un metodo Java. Ma in quale libreria si trova? Io qui vedo solo un import ovvero: Java.util.*
Cmq saresti così gentile da spiegarmi come funziona questa concatenazione di metodi e a cosa serve fare così ? Grazie veramente!!!
Ballantine
30-08-2012, 00:52
Edit: ho letto che è un metodo Java. Ma in quale libreria si trova? Io qui vedo solo un import ovvero: Java.util.*
Cmq saresti così gentile da spiegarmi come funziona questa concatenazione di metodi...
Esatto, equalsIgnoreCase() è un metodo Java, appartenente alla classe String.
La classe String appartiene al package java.lang (http://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html), che contiene tutte le classi "base" per la programmazione Java. I package sono dei contenitori utilizzati per raggruppare classi, che solitamente appartengono alla stessa categoria (es: java.io contiene tutte le classi relative all'input/output). Importando i package puoi utilizzare le classi da esso contenute e i metodi di queste classi. Il package java.lang però è un caso particolare, poiché viene automaticamente incluso anche senza scrivere il relativo import. Se così non fosse, il codice da te postato non compilerebbe, poiché il compilatore non sarebbe in grado di riconoscere nemmeno i tipi "base" come String.
Tornando al metodo equalsIgnoreCase(), ti spiego più nel dettaglio come è viene effettuata la chiamata:
1) si parte da un oggetto di tipo Testo, sul quale viene chiamato il suo metodo getAutore(), che restituisce un oggetto di tipo String.
2) siccome hai un oggetto di tipo String, puoi chiamare su di esso i metodi della relativa classe (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) (tabella "Method Summary"). Tra questi metodi troverai anche equalsIgnoreCase(...).
3) il metodo equalsIgnoreCase restituisce un booleano, che verrà usato per determinare il risultato della successiva clausola "AND".
...e a cosa serve fare così ?
Queste concatenazioni di solito vengono usate se in seguito non si devono riutilizzare i valori restuiti dai metodi concatenati.
Prendiamo ad esempio il codice esteso che ti avevo scritto prima e quello postato da te in origine. Le chiamate "intermedie" getAutore() e getTitolo() vengono eseguite solo quella volta all'interno del metodo, quindi la mia versione estesa non porta nessun beneficio poiché autoreTesto e autoreTitolo vengono utilizzate una volta sola.
Poniamo invece che il metodo, ogni volta che viene trovato un libro diverso da quello che si sta cercando, stampi a video il nome e il titolo di questo libro:
for(Iterator<Testo> i = testi.iterator();i.hasNext();){
Testo testo = (Testo)i.next();
if(testo.getAutore().equalsIgnoreCase(autore) && testo.getTitolo().equalsIgnoreCase(titolo))
return testo;
else
System.out.println("Il libro " + testo.getTitolo() + " di " + testo.getAutore() + " non è quello che stiamo cercando.");
}
In questo caso avrebbe senso memorizzare i risultati di getTitolo() e getAutore() in due variabili, poiché entrambi vengono chiamati due volte.
In questo caso utilizzare due variabili piuttosto che chiamare due volte getTitolo() e getAutore() non ha un impatto visibile sulle performance perché sono metodi molto semplici, ma se al loro posto dovessimo chiamare dei metodi che effettuano delle operazioni "pesanti" (es: reperimento/inserimento di una grande mole di dati da/in un database) allora la differenza sarebbe notevole.
Ok, quindi se ho capito bene il compilatore prima esegue (testo.getAutore)-> questo come risultato mi da una stringa e dopo a questa stringa risultante viene applicato il metodo equalIgnoreCase giusto?
Quindi per esempio se avessi avuto ad esempio:
testo.getId che è un metodo che mi restituisce un intero non avrei potuto concatenare il metodo precedente?
ps: che vuol dire una cosa del tipo:
Punteggio tmp = punteggi.get(0); ??
non capisco quel get(0)
Grazie mille! Mi sei stato di aiuto! Ho comprato un libro di java ma dopo aver buttato diverse decine di euro ho visto che non è scritto per niente bene, infatti questi concetti non riesco a reperirle:mc:
ps: che vuol dire una cosa del tipo:
Punteggio tmp = punteggi.get(0); ??
non capisco quel get(0)
Ciao :)
Supponendo che 'punteggi' sia un oggetto di tipo List<Punteggio>, cioè un oggetto che incapsula una lista di oggetti dello stesso tipo (in questo caso Punteggio), il metodo get restituisce l'oggetto che si trova nella lista alla posizione specificata dal parametro passato in ingresso. Quindi in questo caso vai a prendere il primo oggetto (perchè passi 0) che è presente nella lista. Ogni volta che vuoi sapere cosa fa un metodo basta consultare la documentazione online:
http://docs.oracle.com/javase/6/docs/api/java/util/List.html#get(int)
Ciao :)
Supponendo che 'punteggi' sia un oggetto di tipo List<Punteggio>, cioè un oggetto che incapsula una lista di oggetti dello stesso tipo (in questo caso Punteggio), il metodo get restituisce l'oggetto che si trova nella lista alla posizione specificata dal parametro passato in ingresso. Quindi in questo caso vai a prendere il primo oggetto (perchè passi 0) che è presente nella lista. Ogni volta che vuoi sapere cosa fa un metodo basta consultare la documentazione online:
http://docs.oracle.com/javase/6/docs/api/java/util/List.html#get(int)
eh si ci ero arrivato proprio nel momento leggendo altro codice. Grazie mille :)
perdonatemi se vi rompo ancora...adesso sto leggendo un esempio di un sistema di gestione di una squadra di calcio! Il sistema deve tenere conto dei giocatori che stanno nella rosa e delle partite che vengono affrontate dalla squadra, sostituizioni ecc..
Adesso sono nella classe Partita e c'è questo pezzo di codice:
public void addPartecipazione(Partecipazione partecipazione){
partecipazioni.add(partecipazione);
}
public Partecipazione getPartecipazione(Giocatore g){
Iterator<Partecipazione> it = partecipazioni.iterator();
while (it.hasNext()){
Partecipazione partecipazione = it.next();
if (partecipazione.getGiocatore() == g) return partecipazione;
}
System.out.println("***Attenzione da Partita: non c'è la partecipazione del giocatore "+ g.getNome());
return null;
}
}
public void addPartecipazione(Partecipazione partecipazione)
il primo Partecipazione è il tipo e il secondo partecipazione è il dato passato?
e poi volevo chiedere una cosa su iterator... non mi torna come faccia a esaminare il primo elemento dato che inizia sempre dal prox elemento:
while (it.hasNext()){
Partecipazione partecipazione = it.next();
:mc:
public void addPartecipazione(Partecipazione partecipazione)
il primo Partecipazione è il tipo e il secondo partecipazione è il dato passato?
Si, partecipazione è l'oggetto passato e Partecipazione il suo tipo.
e poi volevo chiedere una cosa su iterator... non mi torna come faccia a esaminare il primo elemento dato che inizia sempre dal prox elemento:
while (it.hasNext()){
Partecipazione partecipazione = it.next();
:mc:
Attenzione: nella guardia del while viene chiamato il metodo hasNext() che ti dice semplicemente SE CI SONO O NO oggetti da iterare ma non estrae nulla. Nel corpo del while invece il metodo next() ritorna davvero l'oggetto (che sappiamo esserci perchè altrimenti la guardia fallirebbe e si uscirebbe dal while). Spero di essere stato chiaro :)
Si, partecipazione è l'oggetto passato e Partecipazione il suo tipo.
Attenzione: nella guardia del while viene chiamato il metodo hasNext() che ti dice semplicemente SE CI SONO O NO oggetti da iterare ma non estrae nulla. Nel corpo del while invece il metodo next() ritorna davvero l'oggetto (che sappiamo esserci perchè altrimenti la guardia fallirebbe e si uscirebbe dal while). Spero di essere stato chiaro :)
si infatti ma io mi riferivo al metodo next() ..ovvero il primo next che viene fatto non viene fatto sul secondo? Oppure parte tipo da un indice -1 e quindi il next si riferisce all'elemento 0?
Il concetto di indice, secondo me, è fuoriviante nel caso degli iterator. Un iterator serve a scorrere anche strutture dati non ordinate e non indicizzate da 0 a N-1, come siamo abituati a pensare con gli array. Quindi la prima volta che invochi next() lui prenderà semplicemente il primo elemento in base ad un criterio che dipende dalla struttura dati che stai visitando...
Il concetto di indice, secondo me, è fuoriviante nel caso degli iterator. Un iterator serve a scorrere anche strutture dati non ordinate e non indicizzate da 0 a N-1, come siamo abituati a pensare con gli array. Quindi la prima volta che invochi next() lui prenderà semplicemente il primo elemento in base ad un criterio che dipende dalla struttura dati che stai visitando...
Ohhh grazie mille adesso il concetto mi è chiaro... E' che applicandolo su un ArrayList io pensavo che fosse strutturato come un array e quindi questo next mi depistava un pò... adesso cerco di approfondire poi dovrò comprar eun buon libro mi sa... avevo acquistato Java 7 guida completa ma non mi piace per niente...proverò a venderlo:rolleyes:
Ohhh grazie mille adesso il concetto mi è chiaro... E' che applicandolo su un ArrayList io pensavo che fosse strutturato come un array e quindi questo next mi depistava un pò... adesso cerco di approfondire poi dovrò comprar eun buon libro mi sa... avevo acquistato Java 7 guida completa ma non mi piace per niente...proverò a venderlo:rolleyes:
Si nel caso di ArrayList scorrere con iterator o col classico ciclo for che va da 0 a DIM-1 è praticamente la stessa cosa. Tuttavia in Java le collezioni di oggetti che implementano l'interfaccia List bisogna sempre scorrerle con un Iterator.
Ciao e buon studio!
Si nel caso di ArrayList scorrere con iterator o col classico ciclo for che va da 0 a DIM-1 è praticamente la stessa cosa. Tuttavia in Java le collezioni di oggetti che implementano l'interfaccia List bisogna sempre scorrerle con un Iterator.
Ciao e buon studio!
Ecco quindi in questo caso sarà iterator con le sue operazioni interene che si preoccuperà di partire dal primo elemento!
grazie mille intanto ^^
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.