+ All Categories
Home > Documents > Realizzazione di un catalogo di file MP3 - disi.unige.it · Confronta il brano corrente con quello...

Realizzazione di un catalogo di file MP3 - disi.unige.it · Confronta il brano corrente con quello...

Date post: 12-Dec-2018
Category:
Upload: vunhan
View: 215 times
Download: 0 times
Share this document with a friend
53
Descrizione del Problema Progettazione delle classi Esempio di esecuzione Realizzazione di un catalogo di file MP3 Sonia Pini e Valentina Cord` ı Universit` a degli Studi di Genova Dipartimento di Scienze Matematiche Fisiche e Naturali Laboratorio di Informatica Generale – Corso di Comunicazione Digitale 19 Gennaio 2005 Sonia Pini e Valentina Cord` ı Catalogazione di file MP3
Transcript

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Realizzazione di un catalogo di file MP3

Sonia Pini e Valentina Cordı

Universita degli Studi di GenovaDipartimento di Scienze Matematiche Fisiche e Naturali

Laboratorio di Informatica Generale – Corso di Comunicazione Digitale

19 Gennaio 2005

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Descrizione

Realizzare un programma che gestisce la catalogazione di file MP3e conseguentemente la ricerca all’interno del catalogo.

Il formato MP3 permette di inserire all’interno di un branoinformazioni relative al brano stesso.

Il nostro obbiettivo e costruire un catalogo contenente leinformazioni caratterizzanti i brani a disposizione.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Struttura del Catalogo

Un catalogo deve essere:

permanente, e

ordinabile, su richiesta;

Il file su disco deve essere testuale e contenere i seguenti dati(rigorosamente in quest’ordine)

1 nome dell’artista o del gruppo che interpreta il brano (String);

2 titolo del brano (String);

3 titolo dell’album da cui e tratto il brano (String);

4 anno di produzione dell’album (Integer 1900 ÷ 2100);

5 traccia del CD a cui corrisponde il brano (Integer 1 ÷ 30);

6 genere musicale del brano (String).

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Esempio di riga del catalogo

U2|With or Without You|The Joshua Tree|1987|3|Rock

Le informazioni sono separate dal carattere di barra verticale (|)

NOTA:

Le Stringhe presenti sul file non hanno limite in lunghezza e nonviene usata nessuna convenzione per i titoli

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Analisi degli oggetti coinvolti

Song – Descrive un file MP3 in termini delle informazioni chelo caratterizzano: titolo, artista, album, traccia, anno e genere.

DB – Permettere sia la costruzione del catalogo, che la suamanutenzione e interrogazione.

Query – Rappresenta una generica ricerca all’interno delcatalogo.

ArtistQueryTrackAndAlbumQueryTitleSubstringQueryBeforeYearQuery

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Relazione tra le classi

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song – Attributi

Attributi:

private String title;

private String artist;

private String album;

private int track;

private int year;

private String genre.

NOTA:

Siccome gli attributi di Song sono definiti come privati, occorreradefinire i classici metodi get e set.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song - Implementazione

public class Song implements Comparable {

\\lista attributi

...

int n, int y, String g) {

title = t; artist = a; album = l;

track =n; year = y; genre = g;

}

...

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song - Implementazione

public Song(String s) {

String[] args = s.split("\\|");

artist = args[0];

title = args[1];

album = args[2];

year = Integer.parseInt(args[3]);

track = Integer.parseInt(args[4]);

genre = args[5];

}

public String toString() {

return artist+"|"+title+"|"+album+"|"+year+"|"+track+"|"+genre;

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Metodo split

public String[] split(String regex)

Suddivide la stringa utilizzando come separatore l’espressioneregolare fornita in input. Le sottostringhe vengono memorizzate inun array di String.Esempio:

String s = "U2|Exit|The Joshua Tree|1987|10|Rock";

String[] splitted = s.split("\\|");

Risultato:

splitted[0] = "U2"

splitted[1] = "Exit"

splitted[2] = "The Joshua Tree"

splitted[3] = "1987"

splitted[4] = "10"

splitted[5] = "Rock"

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Espressioni Regolari

Le espressioni regolari sono delle sequenze di caratteri chepermettono di individuare delle sottosrtinghe di una stringa data.In Java le espressioni regolari devono iniziare con il caratterespeciale ’\’Esempi di espressioni regolari:

\n identifica il carattere speciale newline

\t identifica il carattere speciale di tabulazione

\s identifica lo spazio

A queste espressioni possono essere applicati i quantificatori qualiad esempio:

X+ identifica una sequenza di 1 o piu X (X espressioneregolare)

X* identifica una sequenza di 0 o piu X (X espressioneregolare)

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song –Metodo compareTo

public int compareTo(Song s)

Confronta il brano corrente con quello passato come parametro (s);Il confronto e basato su:

nome artista,

titolo album,

numero di traccia e

titolo del brano;

I due brani sono uguali ed il metodo ritorna zero se e solo se sonointerpretati dallo stesso artista, sono tratti dallo stesso album,hanno stesso numero di traccia e hanno lo stesso titolo.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song –Metodo compareTo

public int compareTo(Song s)

Confronta il brano corrente con quello passato come parametro (s);Il confronto e basato su:

nome artista,

titolo album,

numero di traccia e

titolo del brano;

I due brani sono uguali ed il metodo ritorna zero se e solo se sonointerpretati dallo stesso artista, sono tratti dallo stesso album,hanno stesso numero di traccia e hanno lo stesso titolo.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song –Metodo compareTo

Per il resto il confronto e lessicografico (simile al dizionario).

Se i due brani sono interpretati dallo stesso artista si passa aconfrontare il titolo dell’album, se anche questo e uguale siconfronta il numero di traccia ed infine il titolo del brano.

Nel momento in cui uno degli attributi risulta diverso il metodoritornera:

-1 se l’attributo di this e minore del corrispondente attributodi s,

1 altrimenti.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song –Metodo compareTo

U2|With or Without You|The Joshua Tree|1987|3|Rock

U2|Exit|The JOSHUA Tree|1987|10|Rock

Il primo brano e rappresentato dall’oggetto this e il secondodall’oggetto s.this.compareTo(s); −− > ritorna -1

NOTA:

‘‘The Joshua Tree’’ e ‘‘The JOSHUA Tree’’ sono consideratiuguali, il confronto deve essere fatto trascurando il numero di spaziche separano le parole che compongono i vari titoli eindipendentemente dall’uso di minuscole e maiscole nelle parolestesse.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Song - Implementazione

public int compareTo(Song a) {

int partial;

if((partial = artist.trim().replaceAll("\\s+", " ")

.compareToIgnoreCase(a.artist.trim().replaceAll("\\s+"," ")))!=0)

return partial;|

if((partial = album.trim().replaceAll("\\s+", " ")

.compareToIgnoreCase(a.album.trim().replaceAll("\\s+"," ")))!=0)

return partial;

if(track != a.track) return (track - a.track);

return title.trim().replaceAll("\\s+", " ")

.compareToIgnoreCase(a.title.trim().replaceAll("\\s+"," "));

}

NOTA:

I metodi trim e replaceAll sono invocati in cascata.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Metodo trim

public String trim()

Ritorna una copia della stringa eliminando gli spazi all’inizio e allafine.

Esempio:

String s = " U2|Exit|The Joshua Tree|1987|10|Rock ";

s = s.trim(s);

Risultato:

"U2|Exit|The Joshua Tree|1987|10|Rock"

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Metodo replaceAll

public String replaceAll(String regex,

String replacement)

Sostituisce ogni sottostringa identificata dall’espressione regolare(regex) con la stringa identificata dal parametro replacement.

Esempio:

String s = "U2|Exit |The Joshua Tree| 1 987|10|Rock";

s = s.replaceAll("\\s+", "");

Risultato:

"U2|Exit|The Joshua Tree|1987|10|Rock"

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB – Attributi

Rappresenta il cuore del catalogo e dovra permettere sia lacostruzione del catalogo, sia la sua manutenzione edinterrogazione. Gli mp3 vengono aggiunti in testa al catalogo,senza mantenere un ordine, gli elementi gia presenti nel catalogovengono spostati in avanti di una posizione.

Attributi:

private int nsongs;

private Song[] songs;

private String filename.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB – Costruttori e Metodi

Costruttori e Metodi Pubblici:

public class DB {

// lista attributi...

public DB(String fileName) throws IOException {

this.filename = fileName;

reload(); // Ricarica il catalogo} ...

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo write

Scrive il contenuto del catalogo nel file corrispondentesovrascrivendo il catalogo precedente;

public void write() throws IOException {

PrintWriter out = new PrintWriter(

new FileWriter(filename));

for(int i = 0; i < nsongs; i++) //ciclo che scorre le canzoni dell’oggetto DBout.println(songs[i]); //stampa sul file l’iesima canzone

out.close();

}

NOTA:

La stampa su file della canzone viene fatta invocandoautomaticamente il medoto toString implementato nella classeSong

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo reload

Ricarica dal file i contenuti del catalogo nell’oggetto;

public void reload() throws IOException {

BufferedReader in = new BufferedReader(

new FileReader(filename));

String line = in.readLine();

nsongs = 0;

while(line != null) { //Conta il numero di canzoni (righe) del file.nsongs++;

line = in.readLine();

}

in.close();

...

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo reload

{

...

songs = new Song[nsongs]; //crea un array di dim. pari al numero delle canzoniin = new BufferedReader(new FileReader(filename));

line = in.readLine();

int i =0;

while(line != null){

songs[i++] = new Song(line); //salva i dati delle canzoni nell’arrayline = in.readLine();

}

in.close();

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo clone

Crea una copia dell’oggetto e la ritorna;

public Object clone(){

DB cloned = new DB(); //crea un nuovo oggetto DB vuotocloned.setFilename(this.getFilename()); //setta il filename del nuovo oggettocloned.nsongs = nsongs; //setta l’attributo nsongs del nuovo oggettocloned.songs = new Song[nsongs]; //istanzia l’array con la corretta dimensionefor(int i=0; i<nsongs; i++) //ciclo per riempire l’array

cloned.songs[i] = new Song(songs[i]);

return cloned;

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo backup

Effettua una copia di backup del catalogo in memoria salvandola inun file in cui nome e specificato dal parametro;

public void backup(String bfn) throws IOException{

DB copied = (DB)this.clone(); //crea un nuovo oggetto identico al precedentecopied.setFilename(bfn); //modifica l’attributo filename del nuovo oggettocopied.write(); //scrive i contenuti dell ’ oggetto in un file

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - Metodo query

Estrae dal catalogo tutte le canzoni che verificano la ricerca q;

public Song[] query(Query q){

Vector p = new Vector(); //Vector contenente le canzoni che soddisfano la querySong[] tmp = new Song[1]; //variabile temporaneafor(int i=0; i <nsongs; i++) //scandisco tutte le canzoniif(q.match(songs[i])) //controllo se la canzone soddisfa la queryp.addElement(songs[i]); //se la soddisfa la aggiungo al Vector p

return (Song[])p.toArray(tmp); //trasformo il Vector in un array}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - capitalizeSong

Formatta i titoli dei brani e degli album in catalogo in modo cheogni parola abbia l’iniziale (e solo l’iniziale) maiuscola;public void capitalizeTitles(){

for( int i=0; i <nsongs; i++)

songs[i].capitalize(); //metodo capitalize di Song}

L’implementazione di capitalizeTitles richiede l’introduzione di unnuovo metodo nella classe Song.

public void capitalize() {

String aux[], spaces[];

aux = title.split("\\s+"); //suddivide la stringa usando gli spazi come separatorispaces = title.split("\\S+"); //memorizza gli spazi contenuti nella stringatitle = space[0]+aux[0].substring(0,1).

toUpperCase()+aux[0].substring(1).toLowerCase //ricombina la stringamettendo la prima lettera di ogni parola maiuscola

for(int i=1; i<aux.length; i++)

title += spaces[i]+aux[i].substring(0,1).

toUpperCase()+aux[i].substring(1).toLowerCase();

...

} Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - squeezeSpaces

Permette di eliminare gli spazi e le tabulazioni multiple,rimpiazzare i caratteri di tabulazione con uno spazio e rimuoveregli spazi inutili all’inizio e alla fine dei titoli degli album e dei brani;

public void squeezeSpaces(){

for(int i=0; i<nsongs; i++)

songs[i]=songs[i].squeeze(); //metodo squeeze di Song}

L’implementazione di squeezeSpaces richiede l’introduzione di unnuovo metodo nella classe Song.

public Song squeeze() {

return new Song(title.trim().replaceAll("\\s+", " "),

artist.trim().replaceAll("\\s+", " "),

album.trim().replaceAll("\\s+", " "),

track, year, genre);

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - addSong

Aggiunge al catalogo presente in memoria il brano mp3 specificatocome parametro

public void addSong(Song s){

Song[] ss = new Song[nsongs+1]; //nuovo array di Song con dim. maggiore di 1ss[0]=s; //inserisce in testa all ’array la nuova canzonefor(int i=1;i<ss.length;i++)

ss[i] = songs[i-1]; //sposta le canzoni nel nuovo arraysongs = ss; //sostituisco il nuovo array con quello vecchionsongs++; //incremento il numero delle canzoni

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - removeSong

Cerca e rimuove dal catalogo tutte le occorrenze del brano passatocome parametro; l’uguaglianza tra il brano passato comeparametro e i brani contenuti nel catalogo e verificata con gli stessicriteri usati per il metodo squeeze().

public void removeSong(Song s){

int i = 0;

do{

if(songs[i].compareTo((Object)s)==0) { //confronta la canzone con tutte le altrefor(int k=i+1; k<nsongs; k++) //appena trova la canzone sposta il resto

songs[k-1] = songs[k]; //dell’array di una posizione indietronsongs--; //eliminando quindi la canzone richiesta

}else i++;

}while(i < nsongs);

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - sort

Ordina il catalogo per artisti, album e titolo del brano;Per definizione Song implementa l’interfaccia Comparable quindi eutile sfruttare i metodi della classe Arrays per ordinare in modofacile il catalogo.

public int compareTo(Object o) {

Song s1 = (Song)this; Song s2 = (Song)o;

int partial;

if((partial = s1.artist.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.artist.trim().replaceAll("\\s+"," "))) !=0)

return partial;

if((partial = s1.album.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.album.trim().replaceAll("\\s+"," "))) !=0)

return partial;

return s1.title.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.title.trim()s.replaceAll("\\s+"," "));

}

public void sort() {Arrays.sort(songs, 0, nsongs);}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe DB - Implementazione - sort

Ordina il catalogo per artisti, album e titolo del brano;Per definizione Song implementa l’interfaccia Comparable quindi eutile sfruttare i metodi della classe Arrays per ordinare in modofacile il catalogo.

public int compareTo(Object o) {

Song s1 = (Song)this; Song s2 = (Song)o;

int partial;

if((partial = s1.artist.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.artist.trim().replaceAll("\\s+"," "))) !=0)

return partial;

if((partial = s1.album.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.album.trim().replaceAll("\\s+"," "))) !=0)

return partial;

return s1.title.trim().replaceAll("\\s+"," ")

.compareToIgnoreCase(s2.title.trim()s.replaceAll("\\s+"," "));

}

public void sort() {Arrays.sort(songs, 0, nsongs);}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe Query – Attributi

La classe astratta Query rappresenta una generica ricercaall’interno del catalogo. Fornisce la struttura di base per richiestepolimorfe sul catalogo.

abstract boolean match(Song s)

Metodo astratto che verifica che la canzone s rispetti i criteri diricerca selezionati.

abstract class Query{

abstract boolean match(Song a);

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe ArtistQuery

Rappresenta la ricerca per i brani in catalogo attribuiti ad un certoartista.

private String artist – nome dell’artista di cui si vuoleestrarre i brani;

ArtistQuery(String artist);

public boolean match(Song s) – Controlla se la canzones e interpretata dall’artista specificato dalla variabiledi istanzaartist;

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe ArtistQuery - Implementazione

public class ArtistQuery extends Query {

private String artist;

public ArtistQuery(String a){

artis = a;

}

public boolean match(Song s) {

return(s.getArtist().toLowerCase().trim().replaceAll("\\s+", " ")

.equals(this.artist.toLowerCase().trim().replaceAll("\\s+", " ")));

}

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe TrackAndAlbumQuery

Rappresenta la ricerca di un brano in catalogo che sia presente inun certo album ed abbia una specifica posizione in quell’album.

private String album – nome dell’album di cui si stacercando la traccia;

private int track – numero di traccia a cui corrisponde ilbrano cercato;

TrackAndAlbumQuery(String album, int track);

public boolean match(Song s) – Controlla se la canzones appartiene all’album specificato dalla variabile di istanzaalbum ed e la traccia di posizione specificata dalla variabiledi istanza track;

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe TrackAndAlbumQuery - Implementazione

public class TrackAndAlbumQuery extends Query {

private String album;

private int track;

public TrackAndAlbumQuery(String a, String t){

album = a;

track = t;

}

public boolean match(Song s) {

return(s.getAlbum().toLowerCase().trim().replaceAll("\\s+", " ")

.equals(this.album.toLowerCase().trim().replaceAll("\\s+", " ")) &&

s.getTrack() == this.track);

}

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe TitleSubstringQuery

Rappresenta la ricerca, in catalogo, dei brani i cui titoli contengonola stringa specificata.

Fate attenzione che la stringa deve essere trovataindipendentemente dagli spazi nel titolo, dalle differenzemaiuscolo/minuscolo ed ovviamente dal fatto che sia parte di unastringa piu grande.

private String substring – stringa che si vuole cercarenei titoli dei brani presenti nel catalogo;

TitleSubstringQuery(String substring);

public boolean match(Song s) – Controlla se la stringacontenuta nella variabile di istanza substring e presente neltitolo della canzone s;

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe TitleSubstringQuery - Implementazione

public class TitleSubstringQuery extends Query {

private String substring;

public TitleSubstringQuery(String s){

substring = s.trim().replaceAll("\\s+", " ").toLowerCase();

}

public boolean match(Song s) {

int indx = s.getTitle().toLowerCase().trim().replaceAll("\\s+", " ")

.indexOf(substring);

if (indx >= 0) return true;

else return false;

}

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe BeforeYearQuery

Rappresenta la ricerca, in catalogo, dei brani prodotti primadell’anno specificato indipendentemente dal loro autore.

Fate attenzione che la stringa deve essere trovataindipendentemente dagli spazi nel titolo, dalle differenzemaiuscolo/minuscolo ed ovviamente dal fatto che sia parte di unastringa piu grande.

private int year – l’anno interessato dalla ricerca.

BeforeYearQuery(int year);

public boolean match(Song s) – Controlla se la canzones e stata prodotta prima dell’anno specificato dalla variabile diistanza year.

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Classe SongClasse DBClasse Query

Classe BeforeYearQuery - Implementazione

public class BeforeYearQuery extends Query {

private int year;

public BeforeYearQuery(int y){

year = y;

}

public boolean match(Song s) {

return(s.getYear() < this.year);

}

}

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

public static void main(String argv[]) {

try{

DB testDB = new DB("mp3."+argv[0]);

testDB.addSong(new Song("Sex Crime", "Eurythmics",

"1984 for the Love of the Big Brother", 2, 1984, "Rock"));

testDB.addSong(new Song("With or Without You", "U2", "The Joshua Tree",

3, 1987, "Rock"));

testDB.addSong(new Song("Exit", "U2", "The JOSHUA TrEe", 10,

1987, "Rock"));

System.out.println("DB: originale\n"+testDB);

...

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

Screen

Sex Crime|Eurythmics|1984 for the Love of the

Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// .../∗ Back−up it in mp3b ... ∗/testDB.backup("mp3b."+argv[0]);

/∗ Clone the DB: testDB in tmp ∗/DB tmp = (DB)testDB.clone();

/∗ U2WithOrWithoutYou will be put inside the DBs several times ∗/Song U2WithOrWithoutYou = new Song(

"wITH or Without You", "U2", "The Joshua Tree", 12, 1987, "Rock");

/∗ Fill the DB: tmp ∗/tmp.addSong(U2WithOrWithoutYou);

tmp.capitalizeTitles();

tmp.addSong(new Song("What have I Done to deserve This?",

"Pet Shop Boys", "PopArt: POP (CD1)", 4, 2003, "Lo-Fi"));

/∗ After capitalization it prints DB: tmp on the screen ∗/System.out.println("DB2: copia capitalized\n"+tmp);

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

Screen

DB2: copia capitalized

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

With Or Without You|U2|The Joshua Tree|12|1987|Rock

What have I Done to deserve This?|Pet Shop Boys|PopArt: POP

(CD1)|4|2003|Lo-Fi

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// .../∗ Squeeze spaces out of the copy ∗/testDB.write();

tmp.squeezeSpaces();

System.out.println("DB2: copia ripulita\n"+tmp);

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

Catalogo mp3

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Screen

DB2: copia ripulita

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

With Or Without You|U2|The Joshua Tree|12|1987|Rock

What Have I Done to Deserve This?|Pet Shop Boys|PopArt: POP (CD1)|4|2003|

Lo-Fi

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// ...tmp.reload();

System.out.println("DB2: copia dopo reload\n"+tmp);

Screen

DB2: copia dopo reload

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// ...testDB.addSong(U2WithOrWithoutYou);

testDB.addSong(new Song("Walking on the Moon",

"Police, The", "Every Breath You Take", 4, 2003, "Pop"));

tmp = (DB)testDB.clone();

System.out.println("DB:originale e cloned ne squeezed ne ripulito\n"+testDB);

Screen

DB:originale e cloned ne squeezed ne ripuliti

Walking on the Moon|Police, The|Every Breath You Take|4|2003|Pop

wITH or Without You|U2|The Joshua Tree|12|1987|Rock

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// .../∗ Squeeze the DB: testDB ∗/testDB.squeezeSpaces();

System.out.println("DB: originale squeezed\n"+testDB);

Screen

DB: originale squeezed

Walking on the Moon|Police, The|Every Breath You Take|4|2003|Pop

wITH or Without You|U2|The Joshua Tree|12|1987|Rock

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// .../∗ Remove ”With or Without You” from tmp ∗/tmp.removeSong(U2WithOrWithoutYou);

System.out.println("DB: cloned senza \"With or Without You\"\n"+tmp);

Screen

DB: cloned senza "With or Without You"

Walking on the Moon|Police, The|Every Breath You Take|4|2003|Pop

Sex Crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

Exit|U2|The JOSHUA TrEe|10|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// .../∗ Sort the DB: testDB ∗/testDB.sort();

System.out.println("DB: originale ordinato\n"+testDB);

Screen

DB: originale ordinato

Sex crime|Eurythmics|1984 for the Love of the Big Brother|2|1984|Rock

Walking on the Moon|Police, The|Every Breath You Take|4|2003|Pop

Exit|U2|The JOSHUA TrEe|10|1987|Rock

With or Without You|U2|The Joshua Tree|3|1987|Rock

wITH or Without You|U2|The Joshua Tree|12|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3

Descrizione del ProblemaProgettazione delle classi

Esempio di esecuzione

Main

// ...testDB.write();

/∗ Look for a String ∗/Query q = new TitleSubstringQuery("with");

System.out.println("DB: risultato della query con \"with\"\n");

Song[] ss = testDB.query(q);

for(int z=0; z<ss.length; z++) System.out.println(ss[z]);

Screen

DB: risultato della query con "with"

With or Without You|U2|The Joshua Tree|3|1987|Rock

wITH or Without You|U2|The Joshua Tree|12|1987|Rock

Sonia Pini e Valentina Cordı Catalogazione di file MP3


Recommended