2013-09-12 6 views
-5

Мне нужно сравнить два объекта одного и того же класса в одном правиле слюни. Но как я могу знать, что один атрибут принадлежит объекту, созданному в основном классе? Мне нужна помощь!Мне нужно сравнить объекты того же класса

public class CheckerMain { 

    public static void main(String[] args) { 
     try { 
      KnowledgeBase kbase = readKnowledgeBase(); 
      StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 
      KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "ConflictChecker"); 

      DeonticConcept deoCon1 = new DeonticConcept("forbidden");   
      DeonticConcept deoCon2 = new DeonticConcept("permission"); 

      ksession.insert(deoCon1); 
      ksession.insert(deoCon2); 

      ksession.fireAllRules(); 
      logger.close(); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    private static KnowledgeBase readKnowledgeBase() throws Exception { 
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL); 
     KnowledgeBuilderErrors errors = kbuilder.getErrors(); 
     if (errors.size() > 0) { 
      for (KnowledgeBuilderError error: errors) { 
       System.err.println(error); 
      } 
      throw new IllegalArgumentException("Could not parse knowledge."); 
     } 
     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
     return kbase; 
    } 
} 

Я хочу, чтобы сравнить atribute nameConceptDeontic инстансовых в объекты deoCon1 и deoCon2 в одном правиле. Как я могу это сделать?

+0

где этот атрибут? является ли он членом класса ConceptDeontic? какой тип? возможно, используйте код ConceptDeontic. –

+0

Вы можете сделать это с .... равным? deoCon1.getNameConceptDeontic(). Equals (deoCon2.getNameConceptDeontic()); Я принимаю атрибуты String. – n3k0

+0

Послушайте, я использую Jboss Drools. Я пример два объекта (deoCon1 и deoCon2). В моем правиле (Rules.drl) мне нужно сравнить атрибуты объектов экземпляров. Атрибуты (nameDeonticConcepts) принадлежат моему классу (DeonticConcept). Я создаю getts и setts в своем классе. Но я пытаюсь использовать свой экземпляр в своих правилах, и появляется сообщение об ошибке. ** BuildError: Не удалось разрешить OBJECTTYPE deoCon1.getNameConceptDeontic '** Мое правило есть condiction: когда \t deoCon1.getNameConceptDeontic() == deoCon2.getNameConceptDeontic() –

ответ

0

Я думаю, вы спрашиваете: «Как я могу определить класс instanceFoo?» но грамматику трудно расшифровать.

Если это так, используйте оператор instanceof. В вашем случае, instanceFoo будет атрибута родительского объекта:

if (instanceFoo instanceof classBar){ 
    //do stuff 
} 

Или вы можете попробовать getClass() метод, который подробно описан в http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

0

Что-то вроде этого?

rule "..." 
when 
    $dc1: DeonticConcept() 
    $dc2: DeonticConcept(this != $dc1, nameConceptDeontic == $dc1.nameConceptDeontic) 
then 
    ... 
end 

Обратите внимание, что вышеуказанное активирует дважды. Для 1 & 2 и для 2 & 1. Если вам нужно предотвратить это, вы можете заблокировать вторую активацию. Один из способов сделать это - вставить факт MatchedConcepts и добавить дополнительное ограничение, чтобы такого факта не было.

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