Слюни: сравнение без учета регистра? - PullRequest
2 голосов
/ 28 января 2011

Мне нужно сравнить два поля без учета регистра.У меня есть правило что-то вроде этого:

foo : ObjectTypeA()
bar : ObjectTypeB( name == foo.name )

И это работает для строк, которые имеют одинаковый случай.Мне нужно что-то вроде этого, но оно не работает:

foo : ObjectTypeA()
bar : ObjectTypeB( name.equalsIgnoreCase( foo.name ) )

Есть предложения о том, как заставить это работать?Поиск в Google находит предложения использовать «совпадения», но оператор совпадений работает только с жестко закодированным шаблоном.

Ответы [ 3 ]

9 голосов
/ 28 января 2011

Используйте Eval. Метод equalsIgnoreCase также содержит опечатку в вашем примере кода.

bar : ObjectTypeB(  eval( name.equalsIgnoreCase( foo.name ) ) )

Если вы хотите использовать что-то вроде:

ObjectType( name equalsIgnoreCase foo.name )

Вы можете взглянуть на пользовательские операторы Drools. Пример: http://members.inode.at/w.laun/drools/CustomOperatorHowTo.html

2 голосов
/ 28 января 2011

Если вы хотите использовать пользовательский оператор, как упомянул Тони, вы можете скопировать и вставить и настроить этот класс для поддержки метода equalsIgnoreCase:

https://github.com/droolsjbpm/droolsjbpm/blob/master/drools-core/src/main/java/org/drools/base/evaluators/StrEvaluatorDefinition.java

Edson

0 голосов
/ 28 января 2011

==: означает, что сравнивать ссылку на объект, в то время как

name.equalsIgnoresCase (foo.name): означает, что сравнивать содержимое.

пусть предположим
soo.name = "баран";foo.name = "ram";
if (soo.name == foo.name) возвращает false
, поскольку единственный контент - это не объект.

если мы скажем как foo.name = "ram";
soo.name = foo.name;
if (soo.name == foo.name) ** return ** правда

...