|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | ||
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
[PSEUDORISOLTO][Java] Gestire liste senza conoscerne il tipo?
Saluton a voi utenti,
Sto studiando Java e vorrei chiedervi un soccorso su un certo esercizio del mio libro di testo. Prima di tutto ho risolto questo: Quote:
Quello che non sono riuscito a fare è il successivo, che dice: Quote:
Chi mi aiuta verrà molto ringraziato per la sua gentilezza! Ultima modifica di Deep thought : 31-08-2013 alle 18:50. |
||
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Il concetto è abbastanza semplice, io parlo di C# ma credo che pari pari si possa traslare al java (un occhiata alle api ti aiuterà comunque). IEnumerable espone dei metodi per elencare un un oggetto qualsiasi (se la relativa classe implementa l'interfaccia). Come è spontaneo supporre praticamente tutte le classi "contenitore" implementano tale interfaccia, quindi tu puoi enumerare un qualsiasi array, lista o altro contenitore generico creando un metodo che accetti come argomento un IEnumerable<Object> (o nel tuo caso Iterable<Object>). |
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Grazie Kendall, la tua idea mi sarà d'aiuto. La cosa strana è che al punto del libro a cui sono arrivato io le interfacce non sono state ancora introdotte. Mi sembra anche difficile che in un esercizio si debba usare un'interfaccia mai nominata, da cercare nell'API. Che sia una svista degli autori?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
L'unica altra alternativa che mi viene in mente è l'utilizzo di quello che in c# è l'identificatore params, posto prima dell'argomento della funzione (sempre nell'ultima posizione).
Su java è chiamato varargs e si utilizza ponendo nel modello di funzione il tipo seguito da una ellipsis ("..."). Nel tuo caso: Codice:
public Object[] soloPari(Object... args)
{
...
}
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Quote:
Davvero? Io sto studiando "Programmazione in Java"di Apogeo, e tu? Ultima modifica di Deep thought : 13-08-2013 alle 09:37. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
https://today.java.net/pub/a/today/2...9/varargs.html Per completezza posta anche come hai risolto il primo esercizio, in quanto il secondo è solo un estensione del primo e bisogna aggiungere come argomenti le altre tipologie di sequenze esistenti in java |
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Scusa per il ritardo.
Per quanto riguarda il primo esercizio, l'ho risolto con questo codice: Codice:
public static <T> Object[] soloPari(final T[] inputArray) {
Vector<T> outputVector = new Vector<T>();
for (int i=0; i<inputArray.length; i++) {
if (i%2 == 0) outputVector.add(inputArray[i]);
}
Object[] outputArray = new Object[outputVector.size()];
for (int i=0; i<outputVector.size(); i++) {
outputArray[i] = outputVector.get(i);
}
return outputArray;
}
Per quanto riguarda i varargs ho letto l'articolo e so come usarli, ma non mi possono essere utili qui perché l'esercizio chiede di creare un metodo che possa avere come argomento una lista, e non un numero imprecisato di dati. Cioè, il metodo che io devo scrivere deve essere tale da essere chiamato non così: Codice:
soloPari (0, 2, 3456, 1); Codice:
soloPari (array); soloPari (Vector); soloPari (LinkedList); ... P.S. Hollywoodundead, è difficile studiare un libro del genere in inglese? Ci vuole un'ottima conoscenza della lingua, vita all'estero e cose simili? E come mai lo preferisci a quelli in italiano? |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
@Deep
Per il secondo esercizio avevo pensato alla stessa soluzione da te proposta, cioe assegnare un metodo per ogni tipologia di lista presente in java ma come dici bene tu mi pareva una cosa troppo complicata da fare e in quel caso avrei dovuto dare come risposta "impossible for me". Per quanto riguarda varargs ho pensato che come soluzione non era male quella di passare come argomenti le diverse tipologie di liste in java, ma anche qui avevo i miei dubbi che la cosa funzionasse, visto che non sono nemmeno arrivato a studiare gli array. Il libro che studio l'ho scelto primo perchè capisco piu che bene sia in lettura che ascolto la lingua inglese ( poi per i termini tecnici basta un buon dizionario di fianco) e secondo perchè mi sono letto in pdf gli altri libri italiani, e non mi hanno molto entusiasmato. Alcuni di questi sono: 1)Dai fondamenti agli oggetti: corso di programmazione java di Pighizzino (questo è il libro che utilizzano nella facoltà dove andrò a studiare ) che mi è parso dalla lettura molto riduttivo nel spiegare le cose e ti butta in pasto gli esercizi come se il metodo di apprendimento fosse quello di memorizzare i blocchi di codice senza capirne il reale significato. Oltretutto le mie impressioni combaciano anche con alcuni commenti postati su amazon.2)Programmazione Java 1 di Deitel, il commento su amazon è micidiale e non serve aggiungere altro. L'edizione in italiano pare sia stata tradotta in maniera terribile e che i capitoli siano stati organizzati in maniera diversa rispetto alla versione inglese, creando maggiore confusione. 3)Manuale di Java 6 di Claudio de sio cesari: questo è un peccato, perchè l'ho letto per almeno il primo capitolo e inizialmente parte bene solo che lo trovo ridondante e confusionario. I concetti vengono spiegati utilizzando duemila sinonimi diversi per spiegare la stessa cosa e credimi alla fine ti manda nel pallone senza capire bene quello che all'inizio del discorso spiegava chiaramente. Insomma parte bene spiegandoti il concetto e poi ti confonde i concetti iniziali esposti con parole che avrebbe potutto benissimo evitare. Se volessi capirlo bene credo che dovrei leggerlo almeno 3 volte Ci sono altri libri che avrei voluto vedere com'erano ma non li ho trovati in rete e non avevo tempo per andare a vederli in libreria. Tra questi ci sono Programmazione in java di Roberto bruni,Java2 in tasca di loic fieux (per principianti) Il linguaggio java di Gosling James (anche qui la traduzione italiana e di conseguenza gli eventuali errori presenti mi spaventano) e infine Programmazione con java di Savitch Walter. Sull'ultimo libro si Savitch mi piacerebbe sentire qualche parere, perchè pare che la traduzione in italiano non sia stata fatta male, quindi forse andrò a vederlo in libreria. Ho scelto alla fine Core Java I the fundamentals perchè è quello in cui non ho riscontrato pareri negativi su amazon, e sopratutto perchè è spiegato bene.Non è fatto proprio per chi è principiante, ma va benissimo anche per chi inizia ad imparare questo linguaggio ad un livello tra il principiante e il medio. Io mi trovo bene, è un libro lungo perchè ci sono piu di 800 pagine da leggere, quindi magari se qualcuno vuole metterci meno tempo deve ripiegare su altri libri. Approfondisce molti aspetti che sicuramente altri libri non spiegano, e durante la spiegazione fa un confronto con delle note su quelle che sono le differenze con c++ su quel determinato argomento spiegato. Per me che punto ad imparare alla fine l'objc per diventare sviluppatore apple, è un buon inizio. Ultima modifica di hollywoodundead : 14-08-2013 alle 14:14. |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Il libro che sto studiando io è proprio "Programmazione in Java" di Roberto Bruni, e mi sembra abbastanza serio ma al tempo stesso comprensibile. Questa è la prima volta che mi trovo in seria difficoltà. Temo proprio di dover ignorare questo esercizio, per ora, almeno finché non si smuove qualcosa.
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Ho l'edizione del 2011. La lezione l'ho capita bene, e ho anche riletto le parti interessate; secondo me il problema è proprio impossibile, o qualcun altro leggermente più esperto di noi due avrebbe già dato una risposta risolutiva (è pur sempre un esercizio). Sarà stato un errore.
|
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Ho l'edizione del 2011. La lezione l'ho capita bene, e ho anche riletto le parti interessate; secondo me il problema è proprio impossibile, o qualcun altro leggermente più esperto di noi due avrebbe già dato una risposta risolutiva (è pur sempre un esercizio di un libro di testo, non dovrebbe essere difficile per altri). Sarà stato un errore.
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
Codice:
public static <T> Collection<T> soloPari(Collection<T> inputArray) {
List<T> outputList = new ArrayList<T>();
int i = 0;
for (T elem : inputArray) {
if (i % 2 == 0) outputList.add(elem);
i++;
}
return outputList;
}
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
Codice:
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,0);
Collection<Integer> pari = soloPari(list);
for(Integer i : pari) {
System.out.println(i);
}
}
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
Nel programma che hai scritto,hai utilizzato un ciclo for each loop,dove crei una sequenza List che chiami list, di tipo intero con al suo interno un metodo array(che contiene quella sequenza di numeri che hai messo). Poi crei una Collection Framework che chiami pari, di tipo intero, a cui passi il metodo soloPari() (come mai non hai riportato per chiarezza, anche il metodo solopari() postato da deep?) che va a interagire con l'oggetto list. Infine con un ciclo for each loop vai a dire per ogni elemento i, intero, passato nella colletcion pari, vai ad eseguire la stampa...però non mi tornano alcuni passaggi. 1)"i" dove l'hai dichiarata per collegarla agli elementi dell'array? 2)Il programma scritto cosi, è completo o manca appunto da aggiungere il metodo soloPari() e altri pezzi di codice? Secondo me la domanda da farsi è: esiste una oggetto o funzione che inglobi in un colpo solo tutti i tipi di Collections framework in modo tale da passarci solo quello come argomento del metodo soloPari()? altrimenti ritorniamo punto a capo,cioè che bisogna aggiungere ogni singola Collections come argomento del metodo soloPari() Ultima modifica di hollywoodundead : 15-08-2013 alle 23:07. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
1) l'ho dichiarata esattamente dove la vedi
Codice:
//DIchiaro i e assegno ad ogni iterazione il valore successivo contenuto in pari //studiati il foreach in java comunque for(Integer i : pari) 3)Si questo oggetto (sarebbe meglio dire classe) esiste e si chiama per l'appunto Collection... Infatti a soloPari ci puoi passare sia un ArrayList che una LinkedList che un Set ecc... in parole povere tutte le collezioni che java ci mette a disposizione... ti posto il programma intero: Codice:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
*
* @author Simone Rondelli - mone.java[at]gmail.com
*/
public class Main {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
Collection<Integer> pari = soloPari(list);
for (Integer i : pari) {
System.out.println(i);
}
}
public static <T> Collection<T> soloPari(Collection<T> inputArray) {
List<T> outputList = new ArrayList<>();
int i = 0;
for (T elem : inputArray) {
if (i % 2 == 0) {
outputList.add(elem);
}
i++;
}
return outputList;
}
}
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
|
|
|
|
#20 |
|
Junior Member
Iscritto dal: Aug 2013
Messaggi: 24
|
Scusate per la lunga assenza, ma sono stato in vacanza e non ho usato Internet per una settimana.
@mone.java Grazie, questo è proprio quello che mi serviva! Sicuramente da solo non ci sarei mai arrivato, perché non ho mai avuto a che fare con le Collection né sapevo che esistessero. Se ho capito bene, la classe Collection è una specie di classe generica che dà un supporto a tutti i tipi di liste (perdonami per il linguaggio in cui mi esprimo, da novellino)? Poi tu hai creato un metodo generico che prende come argomento una lista qualsiasi e restituisce un oggetto List; il tipo del metodo è Collection<T>, ma il tipo della variabile di ritorno outputList è List, quindi il tipo di ritorno sarà List, vero? EDIT: L'API di Java dice che Collection è un'interfaccia, e io le interfacce non le ho ancora studiate. Che sono? EDIT2: Forse sto capendo qualcosa: il metodo generico soloPari è di qualunque tipo T che implementi l'interfaccia Collection, giusto? Ma allora in questo caso non si sarebbe dovuto scrivere, nell'intestazione del metodo, Codice:
public static <T extends Collection<T>> soloPari Ultima modifica di Deep thought : 23-08-2013 alle 13:06. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:21.












) che mi è parso dalla lettura molto riduttivo nel spiegare le cose e ti butta in pasto gli esercizi come se il metodo di apprendimento fosse quello di memorizzare i blocchi di codice senza capirne il reale significato. Oltretutto le mie impressioni combaciano anche con alcuni commenti postati su amazon.







