Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Метод buildSearchResults в классе SearchScreen получает список записей, вызывая метод getMatchesByName (String matchKey) в классе AddressBook. Этот метод фильтрует записи для вывода лишь тех, в которых поле имени начинается с matchKey.

Метод getMatchesByName выполняет эту фильтрацию, пересылая фильтр записей как первый аргумент в метод enumerateRecords . Экземпляр MatchAllNamesFilter определяет семантику фильтра для нахождения всех записей, которые начинаются с подстроки matchKey.

Метод enumerateRecords обращается к следующему методу объекта фильтра для каждой записи в хранилище:

boolean matches(byte [] candidate)

Если

в результате выводится true, он включает эту запись в набор списка. Теоретически это сходно с определением запроса SQL в системе родственных баз данных. Объект RecordFilter определяет критерии поиска.

Обратите внимание, что в листинге 7.2 аргумент RecordFilter был равен нулю. Таким образом класс RecordList может вывести все записи в списке, фильтр не применяется.

Вы можете описать несколько фильтров для поддержки поиска по различным критериям. Следуя программе листинга 7.4, вы можете определить несколько внутренних классов, которые реализуют RecordFilter и используют внутренний класс, соответствующий осуществляемому поиску.

Компараторы записей

Вы, несомненно, заметили, что второй аргумент, пересланный в enumerateRecords в предыдущих примерах, был равен нулю. Этот второй параметр является «заполнителем» для компаратора записей. Компаратор записей — это объект, который сравнивает две записи для определения их упорядочивания или сортировки. Компараторы предоставляют приложениям возможность выполнять различную сортировку.

Как и фильтры, компараторы определяют семантику функции сравнения. Компаратор записей является реализацией интерфейса RecordComparator, который определяет единственный метод

int ccmparefbyte [] recordl, byte [] record2)

Компаратор также определяет три константы, описанные в таблице 7.1, которые ваша реализация должна использовать как текущие выводимые значения данного метода.

Таблица 7.1. Константы RecordComparator

Константа — Описание

public static int EQUIVALENT — Две записи эквивалентны в соответствии с семантикой сравнения

public static int FOLLOWS — Запись 1 «больше», чем запись 2, в соответствии с семантикой сравнения

public static int PRECEDES — Запись 1 «меньше», чем запись 2, в соответствии с семантикой сравнения

Идея использования компараторов сходна с понятием фильтрации записей. Вы определяете класс, который реализует интерфейс javax.microedition.rras.RecordComparator. Вы передаете его экземпляр в вызов enumerateRecords . Записи, извлеченные из хранилища записей, сравниваются друг с другом, по две одновременно, а затем сортируются в соответствии с результатами сравнения. Вы можете таким образом извлекать записи из списка в порядке, определяемом компаратором.

В листинге 7.4 демонстрируется использование компаратора записей. Он определяет новый внутренний класс класса AddressBook, который вы видели в листинге 7.1. Новый внутренний класс AlphabeticalOrdering реализует RecordComparator. Его метод сравнения извлекает поле имени из каждого параметра байтового массива и сравнивает их лексикографически (по

словам).

Листинг 7.4. Этот компаратор записей определяет семантику упорядочивания записей, базируясь на лексикографической сортировке значений их полей имени

/* *

Этот внутренний класс реализует RecordComparator, чья политика заключается в выполнении сортировки по алфавиту.

*/

class AlphabeticalOrdering implements RecordComparator

/**

Конструктор No-arg.

*/

public AlphabeticalOrdering

}

super;)

public int comparelbyte [] reel, byte [] rec2)

ByteArraylnputStream baisl =

new ByteArraylnputStream(reel);

DatalnputStream disl = new DatalnputStream (baisl);

ByteArraylnputStream bais2 —

new ByteArraylnputStream(rec2);

DatalnputStream dis2 = new DatalnputStream(bais2);

String namel = null;

String name2 = null; try

(

namel = disl.readUTF ;

name2 = dis2.readUTF ;

catch (lOExceotion ioe)

ioe.pnntStackTrace ;

}

if (namel == null I | name2 == null) return 0;

int result = namel.compareTo(narae2);

if (result < 0)

return RecordComparater.PRECEDES;

else if (result == 0)

return RecordComparator.EQUIVALENT;

else

return RecordComparator.FOLLOWS;

}

}

Ваша адресная книга может использовать этот новый компаратор для лексикографической сортировки списка имен, извлеченных из хранилища записей. Например, чтобы отсортировать имена, выведенные поиском, вы просто создаете экземпляр вашего нового компаратора и пересылаете его как второй аргумент в вызов enumerateRecords . Следующий фрагмент кода, показанный в листинге 7.5, является новой версией вызова метода getMatchesByName(String matchKey) в классе AddressBook.

Листинг 7.5. Чтобы осуществить сортировку, просто перешлите экземпляр компаратора в вызов списка записей из хранилища записей. Различные списки могут определять различную политику сортировки

RecordEnumeration getMatchesByName(String matchKey)

throws RecordStoreNotOpenException

{

MatchAllNaraesFilter filter =

new MatchAHNamesFilter (matchKey);

AlphabeticalOrdering comparator =

new AlphabeticalOrdering;

return recordStore.enumerateRecords(filter,

comparator, false);

}

Вы можете запустить это приложение и определить для себя, какие из записей, выведенных в результате поиска, теперь будут отсортированы лексикографически. Вы также можете использовать этот компаратор для сортировки имен, выводимых в List функцией ввода адресной книги. Вместо пересылки null как для фильтра, так и для компаратора перешлите экземпляр компаратора AlphabeticalOrdering при извлечении списка всех записей.

Блоки прослушивания записей
Поделиться:
Популярные книги

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Вельяминовы - Дорога на восток. Книга 2

Шульман Нелли
2. Дорога на восток
Приключения:
исторические приключения
5.00
рейтинг книги
Вельяминовы - Дорога на восток. Книга 2

Коммунисты

Арагон Луи
5. Реальный мир
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Коммунисты

Рождество по-эльфийски. Напарники без цензуры

Филеберт Леси
Фантастика:
фэнтези
юмористическое фэнтези
детективная фантастика
5.00
рейтинг книги
Рождество по-эльфийски. Напарники без цензуры

Боги и человек (статьи)

Синюков Борис Прокопьевич
Научно-образовательная:
культурология
5.00
рейтинг книги
Боги и человек (статьи)

Чувствуй себя как хочешь

Холланд Саммер
2. Парни из Манчестера
Любовные романы:
остросюжетные любовные романы
5.00
рейтинг книги
Чувствуй себя как хочешь

В объятьях тьмы

Just Charlie
Любовные романы:
любовно-фантастические романы
4.50
рейтинг книги
В объятьях тьмы

Весь Нил Стивенсон в одном томе. Компиляция

Стивенсон Нил Таун
Фантастика:
научная фантастика
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Весь Нил Стивенсон в одном томе. Компиляция

Скорость побега. Чародей поневоле

Сташеф Кристофер
Фантастика:
научная фантастика
5.00
рейтинг книги
Скорость побега. Чародей поневоле

Новый век начался с понедельника

Омельянюк Александр Сергеевич
Детектив-экшин
Детективы:
исторические детективы
политические детективы
5.00
рейтинг книги
Новый век начался с понедельника

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Танец убийц

Фагиаш Мария
Проза:
историческая проза
5.00
рейтинг книги
Танец убийц

Сквозь тернии

Юрин Александр
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Сквозь тернии

Иржина

Завойчинская Милена
Фантастика:
фэнтези
8.12
рейтинг книги
Иржина