/** Compito del 24-Dic-2001 Il dizionario viene realizzato mediante una tabella. Nella tabella l'indice (k-1) e' associato al capitolo k, in modo che, ad esempio, l'indice 0 sia associato al capitolo 1. @author F. Bombi @version 24-12-2001 */ import java.util.Scanner; import java.util.NoSuchElementException; public class Testo { // costanti private final int NUMERO_CAPITOLI = 10; private final String PAROLA_CHIAVE = ""; // variabili di esemplare private String[] capitolo; private int capitoloSize; // costruttore public Testo() { capitolo = new String[NUMERO_CAPITOLI]; capitoloSize = 0; } /** restituisce il numero di capitoli memorizzati. @return il numero di capitoli memorizzati */ public int capitoli() { return capitoloSize; } /** memorizza internamente il testo passato come argomento. Il testo in ingresso contiene anche la PAROLA_CHIAVE per separare i capitoli. @param testo il testo @throws java.lang.IllegalArgumentException */ public void inserisciTesto(String testo) throws IllegalArgumentException { // argomenti inattesi if (testo == null) throw new IllegalArgumentException("inserisciTesto > manca testo"); Scanner st = new Scanner(testo); capitolo[0] = ""; // primo capitolo: per ora vuoto // se la prima parola e' la PAROLA_CHIAVE viene ignorata, // altrimenti viene inserita nel primo capitolo (indice = 0). String primaParola = st.next(); if (!primaParola.equals(PAROLA_CHIAVE)) capitolo[0] += primaParola + " "; // scansione del testo while (st.hasNext()) { String parola = st.next(); /* messaggio di debugging System.out.println("inserisciTesto> parola letta:" + parola); */ if (parola.equals(PAROLA_CHIAVE)) { /* messaggio di debugging System.out.println("inserisciTesto> Capitolo " + capitoloSize + ": " + capitolo[capitoloSize]); */ capitoloSize++; // eventuale ridimensionamento dell'array if (capitoloSize == capitolo.length) capitolo = resize(); capitolo[capitoloSize] = ""; // inizializzazione capitolo corrente } else { /* messaggio di debugging System.out.println("inserisciTesto> aggiunge: " + parola); */ capitolo[capitoloSize] += parola + " "; } } // incremento numero di capitoli capitoloSize++; } /** Restituisce il testo corrispondente al capitolo n. Il testo e' quello compreso tra la n-esima istanza della PAROLA_CHIAVE e la istanza n+1-esima, o la fine del testo se la n-esima istanza della PAROLA_CHIAVE e' l'ultima. Se non e' presente l'n-esima istanza della PAROLA_CHIAVE verra' restituita una stringa vuota. @param n il capitolo da restituire @return stringa contenente il capitolo se il capitolo e' presente, altrimenti la stringa vuota */ public String leggiCapitolo(int n) { if (n - 1 < capitoloSize) return capitolo[n - 1]; return ""; // stringa vuota } // ridimensiona l'array contenente i capitoli private String[] resize() { String[] nuovoCapitolo = new String[2 * capitolo.length]; for (int i = 0; i < capitolo.length; i++) nuovoCapitolo[i] = capitolo[i]; return nuovoCapitolo; } /** semplice metodo main() di prova */ public static void main(String args[]) { String libro = " testo del primo capitolo " + " testo del secondo capitolo " + " testo del terzo capitolo"; Testo mioTesto = new Testo(); mioTesto.inserisciTesto(libro); for (int i = 0; i < mioTesto.capitoli(); i++) { System.out.println("Capitolo " + (i + 1)); System.out.println(mioTesto.leggiCapitolo(i + 1)); } } }