Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [java] classa astratta

  1. #1

    [java] classa astratta

    Ciao a tutti,
    ho un problema di compresione sulla creazione di un metodo, che richiama una classe astratta che estende altre 4 classi.vi spiego subito:
    il metodo Song[] query(Query q):chiede di estrarre da un array(nella quale ho memorizzato le mie inf) gli elementi che verificano la ricerca q;

    questo metodo e' collegato con la creazione di una classe madre astratta di nome "Query" che ha all'interno un metodo "abstract boolean match(elemento s)" che verifica che l'elemento s rispetti i criteri di ricerca selezionati.
    questa l'ho definita molto semplicemente essendo astratta:
    public abstract class Query
    {
    public abstract boolean match(Song s);
    }
    e ho demandato lo sviluppo del metodo alle varie sottoclassi che estendno questa:
    vi faccio un'esempio di che cosa e' richiesto nella sottoclasse:
    la classe ArtistQuery estende la classe Query.
    e questa classe rappresenta la ricerca per gli elementi nel mio array
    (gia presente in hd)che sono attribuiti ad un certo artista.
    la classe ha una variabile d'istanza "private String artist"(che contiene il nome dell'artista dalla quale si vogliono estrarre i brani.
    il costruttore ArtistQuery(String a) si limita ad inizializzare i campi privati di questa classe.
    e poi c'e' il metodo "boolean match(elemento s)"(che e' lo stesso dichiarato nella Query madre ma non sviluppato perche' abstract) che controlla se l'elemento s e' interpretato dall'artista specificato nella variabile d'istanza.ritorna true se vera e false se e' falsa.
    La stessa cosa succede per le altri classi che estendo query ma che hanno tipi di ricerche diverse.
    questa sottoclasse l'ho intestata come segue:
    public class ArtistQuery extends Query{
    private String artist;
    private String tmpArtist;//serve per togliere gli spazi dalla parola acquisita
    private String tmpArtist2;//idem ma riferito alla canzone dell'array gia memorizzato
    public ArtistQuery(String a)
    {

    artist=a;
    }
    e poi ho inserito questo metodo: che mi confronta l'artista inserito con l'artista dell'elemento s.
    public boolean match(Song s)//e' lo stesso dichiarato nella abstract
    {



    tmpArtist = this.artist;
    tmpArtist = tmpArtist.replaceAll(" ", "");

    tmpArtist2 = s.getArtist();
    tmpArtist2 = tmpArtist2.replaceAll(" ", "");



    if(this.tmpArtist.compareToIgnoreCase(tmpArtist2)= =0)
    {
    return true;
    }
    else{
    return false;
    }
    }
    }
    il tutto me l'ho compilato tranquillamente e mi sembra che possa avere un senso logico.il problema sta quando devo creare il metodo iniziale richiesto.forse sbaglio qualcosa a livello di logica.
    perche' non riesco a capire come invocare questo metodo match e quindi estrarre tutti gli elementi che fanno parte dell'array creato su disco in un'altro array il cui contenuto e' relativo agli elementi che verificano una tale ricerca q.(come per esempio la ricerca per artita)
    vi scrivo qui sotto il codice che penso sia sbagliato ma non capisco dove:

    public Song[] query(Query q)
    {
    int x;
    Song[] query;

    if(songs!=null)
    query = new Song[songs.length];
    for(x = 0 ;x <= songs.length; x++)
    {
    if((artist.match(songs[x]))==true)
    {
    query[x]=songs[x];
    }
    }

    return query;
    }

    spero che qualcuno riesca a farmi capire dove sto sbagliando
    Cordiali saluti
    p.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Scusa... non ho capito quasi niente di ciò che fa il programma e di ciò che, invece, vorresti ottenere... se posti l'intero codice, forse riesco a raccapezzarmi meglio.

    PS: Racchiudi il codice fra i tag [*CODE] e [*/CODE] (senza l'asterisco), così risulta più leggibile:
    codice:
    public class MiaClasse {
       public void mioMetodo() {
          // corpo del metodo
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Allora... c'è un errore in compilazione dovuto al fatto che tu tenti di richiamare il metodo match() su una variabile artista che non è definita da nessuna parte. Forse volevi richiamare il metodo match() sul parametro passato al metodo?
    Ho notato, comunque, che ci sono un po' di errori: hai aperto una parentesi in più nell'istruzione if e devi assegnare il valore null (o altro valore) all'array, dato che la sua inizializzazione viene effettuata all'interno di una condizione, altrimenti il compilatore si arrabbia.
    Poi, suggerimento, è inutile confrontare valori booleani, come è inutile ritornare valore come true e false condizionati da un istruzione if...
    Questo, comunque, è il metodo che non dà errori in compilazione, il programma non l'ho provato:
    codice:
    public Song[] query(Query q) {
       int x;
       Song[] query = null;
    
       if(songs!=null)
          query = new Song[songs.length];
    
       for(x = 0 ;x <= songs.length; x++) {
          if(q.match(songs[x])) {
             query[x]=songs[x];
          }
       }
    
       return query;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4

    [java]metodo

    Ciao grazie prima di tutto per avermi risposto.Quello che hai scritto l'ho provato e confermo compila.l'unica cosa su cui mi sto tirando scemo e come faccio una volta che scritto e invocato questo metodo sul mio db a fargli stampare il tutto riga x riga di quello che mi ha trovato.Ho dovuto poi includere il tutto in un try catch perche' mi dava inizialmente una volta che inserivo l'artista che volevo cercare l'eccezione ArrayIndexOutOfBoundsException.
    ti scrivo qui sotto il codice del punto 8 del menu .dimmi te se sbaglio o che cosa mi manca per ottenere una stampa completa delle song che soddisfano la tale ricerca.
    codice:
    case 8:
    int opzione;
    
    
    do{ 
    
    	System.out.println("[1]Ricerca x Artista: "); 
    	System.out.println("[0]Torna indietro"); 
    	System.out.print ("\nscelta: "); 
    	opzione = getPosInt(); 
    	if(opzione == -1 ) break; 
    	
    	}while((opzione <0)||(opzione>1)); 
    
    	if(opzione<=0)break;
    	
    	System.out.print("Inserisci artista da cercare:  ");
    	String artist2 = getString();
    	
    	switch(opzione)
    	{
    	case 1:
    	try {
          // codice da proteggere 
            
    	  ArtistQuery aQ  = new ArtistQuery(artist2);
    	  System.out.println(db.query(aQ));
    	 
           }
           catch (ArrayIndexOutOfBoundsException e){
           //gestione eccezione
           System.out.println(e.getMessage());  // stampa messaggio di errore
          } 		
    		
    		
    		
    	
          		case 0:return;
    	
      	}   
    		break;
    .Ciao e grazie ancora

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Ciao.
    Il try/catch per l'ArrayIndexOutOfBoundsException lo puoi togliere, in quanto è un'eccezione gestibile da codice. Infatti l'errore si trova nella classe DB, al metodo query():
    codice:
    for(x = 0; x < songs.length; x++)  // <-- Non ci va <=
    {
    	if(q.match(songs[x]))
    	{
    		query[x]=songs[x];
    	}
    }
    Per poter stampare, poi, la lista ordinata, non puoi passare al metodo println un array, ma devi passare ciascuna delle stringhe da stampare. Devi quindi salvare in un array Song[] temporaneo il risultato della query e, successivamente, richiamare System.out.println tante volte quante sono le righe di questo array:
    codice:
            ArtistQuery aQ  = new ArtistQuery(artist2);
            Song [] tmp = db.query(aQ);
            for (int v=0; v<tmp.length; v++) System.out.println(tmp[v]);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ok perfetto funziona ora pero la riga del for la devo inserire per forza...se no mi confronta solo il primo elemento i-esimo -
    grazie di tutto ora ho capito che cosa mi mancava cmq.alla prossima!grazie ancora

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Non intendevo dire che non ci va la riga del for, ma non ci va il confronto con l'uguale... bisogna mettere solo il minore.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.