Volevo sapere come si poteva modificare dai dati all'interno di una LinkedList dopo averne analizzato il contenuto.
Non riesco a trovare la soluzione con Iterator.
Grazie
Volevo sapere come si poteva modificare dai dati all'interno di una LinkedList dopo averne analizzato il contenuto.
Non riesco a trovare la soluzione con Iterator.
Grazie
Iterator ti fornisce man mano gli oggetti della collezione e ti permette di rimuoverli con remove(). Se vuoi modificare lo stato di un oggetto (ammesso che sia "mutabile") questo ovviamente puoi sempre farlo.Originariamente inviato da mark85_159622
Volevo sapere come si poteva modificare dai dati all'interno di una LinkedList dopo averne analizzato il contenuto.
Non riesco a trovare la soluzione con Iterator.
Se invece l'oggetto non è mutabile e vuoi proprio mettere al suo posto un altro oggetto, solo con Iterator non puoi.
Nota che LinkedList offre un altro iteratore:
public ListIterator<E> listIterator(int index)
e ListIterator ha un set(E), quindi in questo caso puoi settare un altro oggetto!
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
E se io invece usassi una HashMap che dopo trovata la chiave modifica il secondo campo.
con get se uso la stesso chiave mi sovrascrive i campi precedenti oppure no?
Per secondo campo .... intendi il "valore" della map, presumo. Se fai un put() di un altro valore, ovvio che cambia la associazione chiave-valore! Cioè la chiave farà riferimento al nuovo valore.Originariamente inviato da mark85_159622
E se io invece usassi una HashMap che dopo trovata la chiave modifica il secondo campo.
con get se uso la stesso chiave mi sovrascrive i campi precedenti oppure no?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
OK, Grazie.
Iterator e' presente anche per le HashMap???
No ... allora non ci siamo. HashMap non fornisce direttamente iteratori. Devi prendere il Set delle entry, oppure il Set delle chiavi. Ed è Set che fornisce l'iteratore.Originariamente inviato da mark85_159622
Iterator e' presente anche per le HashMap???
Ma attenzione! Se prendi il set delle entry e lo iteri, puoi solo rimuovere con remove() dell'iteratore oppure usare setValue() sulla entry. Non puoi fare put() o altra modifica diretta sulla Map durante la iterazione.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
No, mi spiego meglio.
Io ho una file con una chiave e una stringa.
Key1 String1
Key2 String2
ecc...
Puo' capitare che io debba modificare una stringa associata a una certa chiave.
Quindi cosa faccio:
1) prende il file e carico tutto all'interno di una HasMap
2) prendo la chiave cercata e modifico il valore della Stringa
3) ricopio tutte nel file.
Il problema e' il terzo punto. Nel file dovro' di nuovo copiare Chiave e Stringa.
Spero di essere stato piu' chiaro.
Questa e' la situazione nel complesso.
Ho capito ... è legato all'altra tua discussione.Originariamente inviato da mark85_159622
Quindi cosa faccio:
1) prende il file e carico tutto all'interno di una HasMap
2) prendo la chiave cercata e modifico il valore della Stringa
3) ricopio tutte nel file.
Il problema e' il terzo punto. Nel file dovro' di nuovo copiare Chiave e Stringa.
Comunque il punto 3 è semplice: puoi iterare sulle entry (hai già chiave+valore) oppure iterare sulle chiavi. L'iteratore ti darà le chiavi e userai get() sulla Map per ottenere il valore (questo puoi farlo durante la iterazione!). Tutto qui.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Io usato questo tipo di codice per il terzo punto
codice:private int WriteFile( String PathOfFile ) { /* File to write */ File fw; FileOutputStream fos; PrintStream ps; Set e = LineOfFile.entrySet(); Iterator it = e.iterator(); try { fw = new File( PathOfFile ); fos = new FileOutputStream( fw ); ps = new PrintStream( fos ); while (it.hasNext()) { Map.Entry en = (Map.Entry) it.next(); ps.println( entry.getKey() + " " + entry.getValue() ); } } catch ( IOException e ) { return -1; } return 0; }
Dal punto di vista della iterazione e accesso a chiave/valore, ok è corretto. Dal punto di vista della gestione del file e delle eccezioni ... no, purtroppo.Originariamente inviato da mark85_159622
Io usato questo tipo di codice per il terzo punto
Per caso hai principalmente esperienze in altri linguaggi "procedurali" (es. C, Pascal, altri ...)?? In questi altri linguaggi (dove non ci sono le "eccezioni") è praticamente la prassi comune fare funzioni che ritornano uno "status" o dei "codici di errore", per esempio 0 = successo, 1 = errore X, 2 = errore Y o altre cose simili.
Bene, in Java no. In Java ci sono le eccezioni e dovrebbero essere sfruttate al meglio.
Il tuo metodo dovrebbe avere tipo di ritorno void e dichiarare che può lanciare IOException. E inoltre non hai chiuso lo stream, cosa che è da fare in qualunque caso, anche se una eccezione esce dal metodo. E la eccezione va gestita altrove più "al di sopra".
Ti posto la versione corretta, scritta seguendo le convenzioni "standard" per la scrittura di codice Java:
codice:private void writeFile(String filename) throws IOException { Iterator it = lineOfFile.entrySet().iterator(); FileOutputStream fos = null; PrintStream ps = null; try { fos = new FileOutputStream(filename); ps = new PrintStream(fos); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); ps.println(entry.getKey() + " " + entry.getValue()); } } finally { if (ps != null) { ps.close(); } else if (fos != null) { fos.close(); } } }
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet