Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema nello stampare due arraylist in un file con PrintWriter

    Salve.
    Ho un ciclo for che effettua una sequenza di calcoli che produce coppie di valori (coordinate) al variare dell'indice indice per valori interi da zero a un dato input grado.
    In tale ciclo vengono anche compilati due ArrayList con .add().
    Stampando gli ArrayList, essi risultano compilati perfettamente.
    Ora ho bisogno di organizzare i valori di questi ArrayList in un file di testo, creato con la classe PrintWriter di modo che per ogni riga ci sia la coppia di valori degli ArrayList alla medesima posizione:
    riga 1 | arraylist1.get(0),arralist2.get(0)
    riga 2 | arraylist1.get(1),arralist2.get(1)
    ...

    Se includo il PrintWriter nel ciclo for di calcolo, il file di testo viene sovrascritto per ogni valore dell'indice e quindi stampo soltanto l'ultima coppia di coordinate.
    Se creo un sottociclo for, con un nuovo indice (ma anche con lo stesso) che vada da 0 a grado, non ho nessun marcatore di errori nel codice ma la console mostra delle exception come se l'indice fosse superiore al size degli ArrayList (cosa non vera), e anche nella chiamata al .get(indice).

    Questo è il blocco di codice interessato:
    codice:
    try {
             PrintWriter writer = new PrintWriter("Radici(" + grado + ")" + reale + "+" + img + "i.txt", "UTF-8");
             writer.println("_pline"); // riga che serve nell'uso del file di testo generato
             for (int i = 0; i != grado; i++) {
                      writer.println(soluzioniR.get(i) + "," + soluzioniI.get(i));
             }
             writer.println("ch"); // riga che serve nell'uso del file di testo generato
             writer.close();
             } catch (IOException e) {
                      System.out.println("Qualcosa non va");
             }
    Questi invece sono i rimandi alle exception su ArrayList.java:
    codice:
        private void rangeCheck(int index) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
    codice:
        public E get(int index) {
            rangeCheck(index);
    
    
            return elementData(index);
        }
    Dove sbaglio?
    Ultima modifica di Gas75; 23-02-2017 a 00:30

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Se includo il PrintWriter nel ciclo for di calcolo, il file di testo viene sovrascritto per ogni valore dell'indice e quindi stampo soltanto l'ultima coppia di coordinate.
    Ovviamente il PrintWriter va creato fuori (prima) del for ... altrimenti se interno al for otterresti N sovrascritture.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Se creo un sottociclo for, con un nuovo indice (ma anche con lo stesso) che vada da 0 a grado, non ho nessun marcatore di errori nel codice ma la console mostra delle exception come se l'indice fosse superiore al size degli ArrayList (cosa non vera), e anche nella chiamata al .get(indice).
    Se soluzioniR e soluzioniI è accertato (sai l'uso che ne fai con gli add) che hanno sempre la stessa lunghezza, il for più sicuro è:

    for (int i = 0; i < soluzioniR.size(); i++)

    E questo NON può sforare se il ArrayList resta di lunghezza tale per tutto il for.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Intendi che PrintWriter va creato fuori dal ciclo for più esterno, quello che riempie gli ArrayList? Ora è fuori dal ciclo for di .get() dei valori (codice copiato nel messaggio), e in virtù di questo mi aspettavo che venissero scritte le righe come mi servono...

    In merito al secondo punto, proverò domani... Per costruzione soluzioniR.size() e soluzioniI.size() sono di uguale lunghezza, pari appunto al valore grado.

    Faccio sapere!

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    A mio parere comunque sarebbe meglio se ti creassi una tua classe (es. NumeroComplesso) che contiene all'interno due campi double relativi alla parte reale e immaginaria del numero e magari un metodo toString e/o altri metodi convenienti.

    Alla lunga lavorare con due arraylist in modo parallelo potrebbe causarti rogne, oltre a non essere molto object oriented.

    Se ti può interessare qui c'è il link a una classe per numeri complessi molto completa.

  5. #5
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    A mio parere comunque sarebbe meglio se ti creassi una tua classe (es. NumeroComplesso) che contiene all'interno due campi double relativi alla parte reale e immaginaria del numero e magari un metodo toString e/o altri metodi convenienti.

    Alla lunga lavorare con due arraylist in modo parallelo potrebbe causarti rogne, oltre a non essere molto object oriented.

    Se ti può interessare qui c'è il link a una classe per numeri complessi molto completa.
    L'applicazione ha uno scopo piuttosto didattico: ricostruire le operazioni tra numeri complessi sfruttando le operazioni base di Java, e poi proporre tutto con una interfaccia grafica per l'utente che non deve accedere alla console.
    L'utilizzo di una classe dedicata ai numeri complessi devierebbe lo scopo di questo "tema" che ho deciso di svolgere: proviene da un programmino che feci su una calcolatrice, dove sicuramente non c'era alcuna classe Java a venirmi in aiuto.

    Comunque il problema è stato appena risolto seguendo i suggerimenti di andbin:
    - PrintWriter creato subito prima del ciclo for esterno;
    - compilazione del file di testo dopo il ciclo for esterno, attraverso un ciclo for interno che sfrutta gli ArrayList già compilati con le soluzioni del ciclo interno.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.