2015-12-24 2 views
0

Я пытаюсь получить результат из кэша с помощью limitFilter:Компаратор с LimitFilter не работает

class Student { 
    long studentId; 
} 

class StudentComparator implements Comparator<Student> { 
    public int compare(Student o1, Student o2) { 
     return o1.getStudentId() - o2.getStudentId(); 
    } 
} 

StudentComparator studentComparator = new StudentComparator(); 
EntryComparator comparator = new EntryComparator(studentComparator,EntryComparator.CMP_VALUE); 
LimitFilter limitFilter = new LimitFilter(AlwaysFilter.INSTANCE, 5) 
limitFilter.setComparator(comparator); 
Set studentSet = null; 
do { 
    studentSet = studentCache.entrySet(limitFilter); 
    ..... 
    // print the set 
    ..... 
    limitFilter.nextPage(); 
} while (studentSet.size() > 0) 

Согласно API

public void setComparator(Comparator comparator) : Set the Comparator 
used to partition the values into pages. 

Так что я ожидал, что limitfilter будет сортировать данные с помощью компаратор, но, похоже, это не так. Например, у меня есть 20 учеников со студенческим диапазоном от 1 до 20. Я ожидаю, что есть 4 studentSet с циклом do/while, который имеет диапазоны: 1-5, 6-10, 11-15, 16-20 соответственно. Но когда-нибудь есть Студент с Id 13 в первом studentSet или 2 в последнем studentSet и т.д.

Есть кто-нибудь сталкивался с этой проблемой, пожалуйста, дайте мне знать вашу идею

+0

Является ли, что ваш первый набор студент не получает 1-5 записи, но некоторые случайные элементы, как 2, 6,3,12,1. В этом случае компаратор будет просто сортировать эти записи и помещать в первый набор учеников. Проверьте, что вы получаете как часть First Student Set. –

+0

Да, у первого набора есть случайные записи. И я не думаю, что они отсортированы. Метод сортировки результата - NamedCache.entrySet (фильтр, компаратор). – user2747502

ответ

0

Согласно JavaDoc для LimitFilter.setComparator(Comparator comparator) (для Согласованность 12.2.1 не менее)

Этот метод предназначен для использования только процессорами запросов. Клиенты не должны изменять содержимое этого свойства.

Чтобы получить описанный результат, вы должны вызвать (внутри цикла):

studentSet = studentCache.entrySet(limitFilter, comparator); 
Смежные вопросы