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.

 

 
Vai all'inizio della pagina