paganoantonio

Untitled

Nov 28th, 2022
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.18 KB | None | 0 0
  1.  
  2. import java.io.*;
  3. import java.util.Scanner;
  4. import java.util.NoSuchElementException; //Attenzione: questa eccezione va
  5.                                          // importata per essere usata
  6.  
  7.  
  8. public class RubricaTester
  9. {   public static void main(String[] args)
  10.     {   //controllo parametri del metodo main
  11.         if (args.length != 2 || args[0].equals(args[1]))
  12.         { System.out.println("Uso: $java RubricaTester filename1 filename2");
  13.           System.out.println("Non usare stesso nome file in lettura/scrittura");
  14.           System.exit(1);
  15.         }
  16.         String filename1 = args[0];
  17.         String filename2 = args[1];
  18.  
  19.         //apertura di file1 in lettura
  20.         Scanner file1 = null;
  21.         try{  file1 = new Scanner(new FileReader(filename1));  }
  22.         catch(FileNotFoundException e)
  23.         {   System.out.println("Problema in apertura File1! Termino");
  24.             System.exit(1); }
  25.  
  26.         //Creazione e  scrittura di rubrica1
  27.         Rubrica rubrica1 = new Rubrica();
  28.         while (file1.hasNextLine())
  29.         {   String line = file1.nextLine();
  30.             Scanner linescan = new Scanner(line);
  31.             try{
  32.             String name = linescan.next(); //nome : campo "key" del dizionario
  33.             String word;
  34.             while (!( word = linescan.next()).equals(":"))//considero anche
  35.                 name += " " + word; //nomi eventualmente composti da piu` parole
  36.             long phone = Long.parseLong(linescan.next()); //dopo i ":" ci deve
  37.                                             //essere un numero in formato long
  38.             rubrica1.insert(name, phone);
  39.             }//NoSuchElementException puo` essere lanciata da next se non
  40.             catch(NoSuchElementException e) //vengono trovati token
  41.             {   System.out.println("Formato inserimento sbagliato");  }
  42.             //NumberFormatException puo` essere lanciata da parseLong se la
  43.             catch(NumberFormatException e) //stringa dopo i ":" non e` un intero
  44.             {   System.out.println("Formato inserimento sbagliato");  }
  45.         }
  46.         System.out.println(rubrica1); //controllo il contenuto di rubrica1
  47.         file1.close();
  48.  
  49.         //Creazione di rubrica2, ricerca e rimozione dati da rubrica1
  50.         //inserimento in rubrica2 di dati rimossi da rubrica1
  51.         Scanner in = new Scanner(System.in); //apertura standard input
  52.         Rubrica rubrica2 = new Rubrica();
  53.         boolean done = false;
  54.         while(!done)
  55.         {   System.out.println("Nome in rubrica1 da spostare in rubrica2?");
  56.             System.out.println("(\"Q\" per terminare)");
  57.             String name = in.nextLine();
  58.             if (name.equalsIgnoreCase("Q"))
  59.                 done = true;
  60.             else
  61.             {   try{rubrica2.insert(name, rubrica1.find(name));//prima copio e
  62.                     rubrica1.remove(name);} //poi cancello. Non viceversa!
  63.                 catch(DictionaryItemNotFoundException e)
  64.                 { System.out.println("Nome non presente in rubrica1" ); }
  65.                 System.out.println("Rubrica1:\n" + rubrica1); //controllo i
  66.                 System.out.println("Rubrica2:\n" + rubrica2); //contenuti
  67.             }
  68.         }
  69.  
  70.         //apertura di file2 in scrittura, salvataggio di rubrica2 in file2
  71.         PrintWriter file2 = null;
  72.         try{  file2 = new PrintWriter(filename2);  }
  73.         catch(FileNotFoundException e)
  74.         {   System.out.println("Problema in apertura File2! Termino");
  75.             System.exit(1); }
  76.         file2.print(rubrica2);
  77.         file2.close();  //Se non chiudo rischio che file2 non venga scritto!!!
  78.         System.out.println("Arrivederci");        
  79.     }
  80. }
  81.  
  82.  
  83. class Rubrica implements Dictionary
  84. {   public Rubrica()
  85.     {   v = new Pair[INITSIZE];
  86.         makeEmpty();
  87.     }
  88.  
  89.     public boolean isEmpty()
  90.     {   return vSize == 0;  }
  91.  
  92.     public void makeEmpty()
  93.     {   vSize = 0;  }
  94.  
  95.     //Bisogna realizzare il comportamento richiesto nell'interfaccia Dictionary:
  96.     //in particolare sovrascrivere coppie gia` presenti e lanciare eccezioni
  97.     //La realizzazione qui proposta ha prestazioni O(n), perche` abbiamo usato
  98.     //un algoritmo di ordinamento per inserimento
  99.     public void insert(Comparable key, Object value)
  100.     {   //precondizioni: controllo anche che value sia un numero long
  101.         if (key == null || !(value instanceof Long) )
  102.             throw new IllegalArgumentException();
  103.         try{   remove(key); } //se la coppia c'e` gia` la rimuovo
  104.         catch(DictionaryItemNotFoundException e){   }//altrimenti tutto ok!
  105.    
  106.         //uso array ridimensionabile!
  107.         if(vSize == v.length) resize();
  108.  
  109.         //riordinamento per inserimento. Attenzione ai cast: v[i-1].getName()
  110.         //e` di tipo String, e puo` essere comparato solo a String
  111.         int i = vSize; // questo ciclo ha tempi di esecuzione O(n)
  112.         while (i > 0 && (v[i-1].getName()).compareTo((String)key) > 0)
  113.         {   v[i] = v[i-1];
  114.             i--;
  115.         }
  116.         //creo un nuovo Pair (attenzione ai cast) e aggiungo al punto giusto
  117.         v[i] = new Pair((String)key, (Long)value);
  118.         vSize++; // aggiorno la dimensione
  119.     }
  120.  
  121.     //metodo ausiliario: lo rendo private, non deve essere usato da altri
  122.     private void resize() //niente parametri espliciti e valori restituiti: ho
  123.     {                     // deciso che raddoppio sempre la dimensione.
  124.         Pair[] newv = new Pair[2*v.length];
  125.         System.arraycopy(v, 0, newv, 0, v.length);
  126.         v = newv; //funziona: v non e` una var. locale ma un campo di esemplare
  127.     }
  128.  
  129.     public void remove(Comparable key)
  130.     {   //uso binSearch per cercare la chiave nell'array non ordinato
  131.         //se la chiave non c'e` lancio DictionaryItemNotFoundException come da
  132.         //specifiche (viene lanciata da binSearch)
  133.         int i = binSearch(0, vSize-1, key);
  134.         for (int j = i; j < vSize-1; j++)
  135.             v[j] = v[j+1];
  136.         vSize--;
  137.     }
  138.  
  139.     public Object find(Comparable key)
  140.     {   //uso binSearch per cercare la chiave nell'array non ordinato
  141.         //se la chiave non c'e` lancio DictionaryItemNotFoundException come da
  142.         //specifiche (viene lanciata da binSearch)
  143.         return v[binSearch(0, vSize-1, key)].getPhone();
  144.     }
  145.  
  146.     //metodo ausiliario: restituisce l'indice in cui ha trovato l'elemento
  147.     private int binSearch(int from, int to, Comparable key)
  148.     {   if (from > to) throw new DictionaryItemNotFoundException();
  149.         int mid = (from + to) / 2; // circa in mezzo
  150.         Comparable middlekey = v[mid].getName();
  151.         if (middlekey.compareTo(key) == 0)
  152.         //In questo caso funzionerebbe anche if (middle.getKey().equals(key))
  153.         //perche` le chiavi sono di tipo String, e il metodo equals e` stato
  154.         //sovrascritto in String in modo da essere coerente con compareTo
  155.             return mid; // elemento trovato
  156.         else if (middlekey.compareTo(key) < 0)  //cerca a destra
  157.             return binSearch(mid + 1, to, key);
  158.         else // cerca a sinistra
  159.             return binSearch(from, mid - 1, key);
  160.     }
  161.    
  162.     public String toString()
  163.     {   String s = "";
  164.         for (int i = 0; i < vSize; i++)
  165.             s = s + v[i] + "\n"; //sfrutto il metodo toString di Pair!
  166.         return s;        
  167.     }
  168.  
  169.     //campi di esemplare e variabili statiche di Rubrica
  170.     private Pair[] v;
  171.     private int vSize;
  172.     private static int INITSIZE = 1;
  173.  
  174.  
  175.     //classe privata Pair: non modificare!!
  176.     private class Pair
  177.     {   public Pair(String aName, long aPhone)
  178.         {   name= aName;
  179.             phone = aPhone;
  180.         }
  181.         public String getName()
  182.         {   return name; }
  183.         public long getPhone()
  184.         {   return phone; }
  185.         /*
  186.             Restituisce una stringa contenente
  187.             - la nome, "name"
  188.             - un carattere di separazione ( : )
  189.             - il numero telefonico, "phone"
  190.         */
  191.         public String toString()
  192.         {   return name + " : " + phone; }
  193.         //campi di esemplare
  194.         private String name;
  195.         private long phone;
  196.     }
  197. }
  198.  
  199.  
  200. interface Dictionary
  201. {
  202.     /*
  203.         verifica se il dizionario contiene almeno una coppia chiave/valore
  204.     */
  205.     boolean isEmpty();
  206.    
  207.     /*
  208.         svuota il dizionario
  209.     */
  210.     void makeEmpty();
  211.  
  212.     /*
  213.      Inserisce un elemento nel dizionario. L'inserimento va sempre a buon fine.
  214.      Se la chiave non esiste la coppia key/value viene aggiunta al dizionario;
  215.      se la chiave esiste gia' il valore ad essa associato viene sovrascritto
  216.      con il nuovo valore; se key e` null viene lanciata IllegalArgumentException
  217.     */
  218.     void insert(Comparable key, Object value);
  219.  
  220.     /*
  221.      Rimuove dal dizionario l'elemento specificato dalla chiave key
  222.      Se la chiave non esiste viene lanciata DictionaryItemNotFoundException
  223.     */
  224.     void remove(Comparable key);
  225.  
  226.     /*
  227.      Cerca nel dizionario l'elemento specificato dalla chiave key
  228.      La ricerca per chiave restituisce soltanto il valore ad essa associato
  229.      Se la chiave non esiste viene lanciata DictionaryItemNotFoundException
  230.     */
  231.     Object find(Comparable key);
  232. }
  233.  
  234. class DictionaryItemNotFoundException extends RuntimeException {}
  235.  
Add Comment
Please, Sign In to add comment