/******************************************************* ******************************************************* Segue il codice di un programma che, dati due nomi di file f1 e f2 su riga di comando, legge il file di testo f1 e ne crea una copia di nome f2. Il codice puo' essere adattato per risolvere il seguente problema. Si assuma di avere due files di testo le cui righe sono ordinate lessicograficamente. Dati i nomi dei file su riga di comando, si generi un terzo file di testo che contiene l'unione dei due file di input, ordinato lessicograficamente. Per leggere e scrivere da files di testo si utilizzino le classi PrintWriter e Scanner, descritte in una delle esercitazioni precedenti. La fusione tra i due files puo' essere ottenuta utilizzando un algoritmo simile all'algoritmo Merge (descritto a proposito del MergeSort), in cui invece di scandire arrays si leggono sequenzialmente files di testo. Il confronto tra due righe puo' essere eseguito utilizzando il metodo compareTo, disponibile sugli oggetti di classe String. ******************************************************* ******************************************************* */ /******************************************************* ******************************************************* Estensioni Utilizzando i metodi charAt, substring, toUpperCase della classe String, fare in modo che nel file di output il primo carattere di ciascuna riga sia sempre maiuscolo. Sempre utilizzando i metodi della classe String, oppure costruendo un oggetto di classe StringBuffer e utilizzando i metodi charAt e delete, eliminare tutti gli spazi in ciascuna riga del file di output (suggerimento: scrivere un metodo che, a partire da un parametro String oppure StringBuffer restituisce un oggetto String o StringBuffer, nel quale sono stati rimossi tutti gli spazi). Assumere che le righe dei files di input (e di conseguenza il risultato) siano ordinati rispetto alla seconda parola. Ad esempio, si potrebbe immainare che i files contengano coppie NOME COGNOME e il file sia ordinato rispetto al cognome Assumendo che ciascuno dei files di input possa contenere righe duplicate, ovviamente adiacenti, e che la stessa riga possa anche comparire in entrambi i files, modificare il programma precedente in modo da riportare nel file di output un solo esemplare per ogni riga duplicata. ******************************************************* ******************************************************* */ import java.util.NoSuchElementException; import java.util.Scanner; import java.io.*; import javax.swing.JOptionPane; public class MergeFiles { public static void main(String[] args) { Scanner fileInput1, fileInput2; PrintWriter fileOutput; try { fileInput1 = new Scanner(new File(args[0])); fileInput2 = new Scanner(new File(args[1])); fileOutput = new PrintWriter(args[2]); String linea1, linea2; // contengono l'ultima linea letta, oppure null se il file e' terminato if(fileInput1.hasNextLine()) linea1 = fileInput1.nextLine(); else linea1 = null; if(fileInput2.hasNextLine()) linea2 = fileInput2.nextLine(); else linea2 = null; while(linea1!=null && linea2!=null) { // System.out.println("primo ciclo "+"\""+linea1+"\" \""+linea2+"\""); if(linea1.compareTo(linea2) <= 0) { fileOutput.println(linea1); // System.out.println("\t\tscritto "+linea1); if(fileInput1.hasNextLine()) linea1 = fileInput1.nextLine(); else linea1 = null; } else { fileOutput.println(linea2); // System.out.println("\t\tscritto "+linea2); if(fileInput2.hasNextLine()) linea2 = fileInput2.nextLine(); else linea2 = null; } } while(linea1 != null) { // System.out.println("coda 1"); fileOutput.println(linea1); if(fileInput1.hasNextLine()) linea1 = fileInput1.nextLine(); else linea1 = null; } while(linea2 != null) { // System.out.println("coda 2"); fileOutput.println(linea2); if(fileInput2.hasNextLine()) linea2 = fileInput2.nextLine(); else linea2 = null; } fileOutput.close(); } catch (FileNotFoundException e) { System.out.println(e); } catch (NoSuchElementException e) { System.out.println(e); } } }