2013-04-22 2 views
0

Например, можно ли создать ряд четных чисел в guava? Что-то вроде:guava смежный диапазон по правилу

Range.closed(0,10) //0,2,4,6,8,10 

Я понимаю, что линия выше, не будет производить нужен выход, но что-то подобное может быть:

Range.closed(0,10, SomeFunctionInterface<Integer>); 

где

interface SomeFunctionInterface<T>{ 
     T computeNext(T first); 
} 

Возможно ли в гуавы? Это все еще смежный диапазон, только что на него применяется определенное правило.

Меня интересует только решение guava.

+2

«Это все еще смежный диапазон, только что на него применяется определенное правило». Не верно, потому что это диапазон 'Integer' и 0 и 2 и т. Д. Не являются непрерывными объектами Integer. Если вы должны были создать тип «EvenInteger» и «DiscreteDomain » (обратите внимание: не делайте этого), я думаю, это может быть смежный диапазон этого типа. «Диапазон» Guava ожидает, что будет один канонический способ сравнения каждого типа Java, который вы хотите использовать с ним, а «ContiguousSet» ожидает один канонический «DiscreteDomain». – ColinD

+0

@ColinD, вы заставили меня переосмыслить это, и я думаю, что это абсолютно правильно. – Eugene

+2

Из javadoc: 'Диапазоны * выпуклые: *, когда два значения содержатся, все значения между ними также должны содержаться. Более формально для любого 'c1 <= c2 <= c3' типа' C', 'r.contains (c1) && r.contains (c3)' подразумевает 'r.contains (c2)'. Это означает, что 'Range ' никогда не может использоваться для представления, скажем, «всех простых чисел от 1 до 100». ' –

ответ

6

Guava может поддерживать это, если вы составляете две операции вместе. Сначала вы создаете набор {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}. Затем вы отфильтровываете его.

Чтобы превратить Range в промежуточный, нефильтрованный набор, создайте ContiguousSet. Для этого вам понадобится DiscreteDomain, который в основном описанный вами SomeFunctionInterface. Поскольку вы имеете дело с целыми числами, вы можете использовать встроенный DiscreteDomain.integers().

Чтобы добраться оттуда до набора только четных чисел, вы можете написать Predicate, а затем передать его, а промежуточный набор - Sets.filter.

+1

FWIW, это дает вам 'Set', а не' Range'. –

+1

(И также FWIW, это намеренно спроектировано, поэтому вы не можете получить «Range», по причинам, о которых говорит Колин.) –

+0

Правда, я исказил ваш вопрос во что-то, на что я мог ответить :) Из любопытства вы сможете пройти с помощью 'Set'? или, возможно, с «Предикатом», созданным составлением оригинального «диапазона» (который сам реализует «Предикат») с помощью предиката «isEven»? Возможно, часть вашей системы, которая ожидает, что «Range» может быть изменена для работы с одним из них. (Если нет, мы можем попытаться дать вам несколько других предложений, если вы хотите подробнее рассказать о своих требованиях.) –

Смежные вопросы