NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Capitolo 54: Comparator e filtri con RecordFilter. Esempio pratico di RecordStore per l'high score di un gioco.

 

RecordFilter e RecordComparator sono interfacce che permettono 'filtrare' ed 'ordinare' i Record presenti in un RecordEnumeration, ottenuto a seguito dell'invocazione del metodo di RecordStore:

  • enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)   :   RecordEnumeration .

 

 

RecordFilter ci obbliga ad implementare un solo metodo:

  • matches(byte[] candidate)   :   boolean

che restituisce true se il 'candidato' deve essere accettato dal filtro, false altrimenti.

 

Per implementare RecordComparator, invece, dobbiamo scrivere il metodo:

  • compare(byte[] rec1, byte[] rec2)   :   int;

che restituisce un intero che indica se rec1 precede, segue o equivale a rec2.

L'intero restituito avrà il valore di una delle seguenti costanti intere:

  • PRECEDES;
  • FOLLOWS;
  • EQUIVALENT.

 

 

Di seguito riporto il codice di una classe creata per gestire, memorizzandolo in maniera permanente sul dispositivo mobile, l'high score di un videogioco J2ME; all'interno, sono presenti i metodi per ottenere un RecordStore per la memorizzazione dei punteggi, stampare a video i punteggi di tutti i giocatori o quelli di un solo giocatore (identificato mediante una stringa) e aggiungere un nuovo punteggio (non è stato impostato un numero massimo di coppie giocatore-punteggio inseribili).

Tale classe implementa le interfacce RecordFilter e RecordComparator per il filtraggio dei risultati, per cui sono presenti opportuni metodi RecordFilter e RecordComparator al suo interno.

Ecco il codice:

import java.io.*;
import javax.microedition.rms.*;



public class HighScore implements RecordFilter, RecordComparator
{
private RecordStore rs = null;
public static String filtroNomeGiocatore = null;


public HighScore()
{
try
{
rs = RecordStore.openRecordStore("punteggi", true);
}
catch(RecordStoreException rse) {}
}


public void add(int punteggio, String nomeGiocatore)
{
int recId;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream outputStream = new DataOutputStream(baos);
try
{
outputStream.writeInt(punteggio);
outputStream.writeUTF(nomeGiocatore);
}
catch(IOException ioe) {}
byte[] b = baos.toByteArray();
try
{
recId = rs.addRecord(b, 0, b.length);
}
catch(RecordStoreException rse) {}
}


public Lista stampaPunteggi()
{
Lista l = new Lista();
try
{
RecordEnumeration re = rs.enumerateRecords(null, this, true);
l = stampaPunteggiAppoggio(re);
}
catch(RecordStoreException rse) {}
return l;
}


public void stampaPunteggio(String nomeGiocatore)
{
try
{
RecordEnumeration re = rs.enumerateRecords(this, this, true);
stampaPunteggiAppoggio(re);
}
catch(RecordStoreException rse) {}
}


private Lista stampaPunteggiAppoggio(RecordEnumeration re)
{
Lista l = new Lista();
int i = 0;
try
{
while(re.hasNextElement())
{
i++;
int id = re.nextRecordId();
ByteArrayInputStream bais = new ByteArrayInputStream(rs.getRecord(id));
DataInputStream inputStream = new DataInputStream(bais);
try
{
int punteggio = inputStream.readInt();
String nomeGiocatore = inputStream.readUTF();
l.inserisci(punteggio, nomeGiocatore);
}
catch(Exception e) {}
}
}
catch(Exception e) {}
return l;
}


public boolean matches(byte[] candidate) throws IllegalArgumentException
{
if(this.filtroNomeGiocatore == null) return false;
ByteArrayInputStream bais = new ByteArrayInputStream(candidate);
DataInputStream inputStream = new DataInputStream(bais);
String name = null;
try
{
int score = inputStream.readInt();
name = inputStream.readUTF();
}
catch(EOFException eofe) {}
catch(IOException eofe) {}
return(this.filtroNomeGiocatore.equals(name));
}


public int compare(byte[] rec1, byte[] rec2)
{
ByteArrayInputStream bais1 = new ByteArrayInputStream(rec1);
DataInputStream inputStream1 = new DataInputStream(bais1);
ByteArrayInputStream bais2 = new ByteArrayInputStream(rec2);
DataInputStream inputStream2 = new DataInputStream(bais2);
int score1 = 0;
int score2 = 0;
try
{
score1 = inputStream1.readInt();
score2 = inputStream2.readInt();
}
catch(Exception eofe) {}
if(score1 < score2) return RecordComparator.PRECEDES;
else if (score1 > score2) return RecordComparator.FOLLOWS;
else return RecordComparator.EQUIVALENT;
}
}

Potete utilizzare questa classe per implementare un semplice database persistente di punteggi per i vostri videogiochi: vi basterà creare, nella vostra MIDlet, un'istanza di HighScore ed utilizzarne i metodi per effettuare le operazioni desiderate.

 

Come avrete notato, la classe appena descritta fa uso di oggetti di tipo 'Lista': tale classe implementava una semplice LinkedList, con l'aggiunta di un metodo di inserimento elementi modificato ed uno di stampa a video dei contenuti creato ad hoc per le particolari esigenze del mio progetto; per utilizzare la classe HighScore così com'è vi basterà, quindi, implementare in maniera analoga una vostra classe 'Lista' basata su LinkedList e personalizzarla come desiderate.

 

Pagina di Francesco Milanese (redbaron85) su Facebook   Pagina di Francesco Milanese (redbaron85) su Google Plus   Profilo di Francesco Milanese (redbaron85) su LinkedIn   Pagina di Francesco Milanese (redbaron85) su Twitter   Canale Youtube di Francesco Milanese (redbaron85ct)

Vai all'inizio della pagina