wtorek, 9 września 2008

Filtrowanie i sotrowanie danych w RMS

Jakiś czas temu pisałem o RMS w J2ME wspominałem tam, że przeglądając zbiór obiektem typu RecordEnumeration możemy filtrować dane oraz je sortować. Dzisiaj trochę więcej o tym napiszę.
Najpierw przypomnijmy sobie jak pozyskać obiekt RecordEnumerate. Dokonujemy tego poprzez wykonanie metody enumerateRecords na obiekcie reprezentującym zbiór rekordów. Metoda ta posiada 3 parametry (kolejno):
- RecordFilter - filtr
- RecordComparator - obiekt do sortowania rekordów
- boolean - parametr czy uwzględniać zmiany w zbiorze (omawiałem wcześniej).

No to zaczniemy od filtrowania...
RecordFilter - pod tą nazwą kryję się interfejs postaci:
public interface RecordFilter {
boolean matches(byte[] candidate);
}

Klasy implementujące ten interfejs muszą posiadać tylko jedną metodę matches testującą czy dany element może należeć do zbioru wynikowego. Metoda zwraca true gdy element spełnia podane warunki lub false w przeciwnym wypadku. Na tej podstawie stwierdzane jest czy dodać go do zbioru wynikowego czy nie.
Dla przykładu napiszmy klase, która będzie przepuszczać tylko liczby większe od zera:
import javax.microedition.rms.RecordFilter;

/**
*
* @author -WooKasZ-
*/
public class PositiveFilter implements RecordFilter {
public boolean matches(byte[] candidate) {
// zakładamy, że rekordy są 4 bajtowe i zawierają liczbę typu int
return Integer.parseInt(new String(candidate)) > 0; // bleee można to ładniej zrobić ?
}
}


Sortowanie.
RecordComparator to także interfejs o następującej definicji:
public interface RecordComparator {
int compare(byte[] rec1, byte[] rec2);
}

Metoda compare porównuje dwa elementy i stwierdza czy rec1 jest większy, mniejszy lub równy. Oczywiście metoda porównywania musi zostać zaimplementowana przez programistę. Dozwolone są następujące wartości zwracane:
- RecordComparator.EQUIVALENT - wartości równe
- RecordComparator.FOLLOWS - pierwszy parametr jest większy od drugiego
- RecordComparator.PRECEDES -pierwszy parametr jest mniejszy od drugiego

Przykład (sortowanie liczb):
import javax.microedition.rms.RecordComparator;

/**
*
* @author -WooKasZ-
*/
public class SortComparator implements RecordComparator {
public int compare(byte[] rec1, byte[] rec2) {
int first = Integer.parseInt(new String(rec1));
int second = Integer.parseInt(new String(rec2));

if (first == second)
return RecordComparator.EQUIVALENT;

if (first > second)
return RecordComparator.FOLLOWS;

return RecordComparator.PRECEDES;
}
}


To wszystko! Możemy za pomocą tych dwu typów klas wybierać tylko dane które nam są potrzebne i układać je w odpowiedniej kolejności.

1 komentarz:

  1. przekonwertować tablicę bajtów na int można w sumie tak:
    int res = (b[0] << 24) + ((b[1] & 0xFF) << 16)+ ((b[2] & 0xFF) << 8) + (b[3] & 0xFF);

    ;-)

    OdpowiedzUsuń