Java中匹配的规则集

时间:2018-07-10 09:12:51

标签: java rule-engine

我应该设计一个接受两个参数发送者和接收者的系统,这两个参数对照规则集进行检查,如果匹配则返回true。 这两个参数可以接受%%和_之类的通配符,其作用类似于sql server中的查询。

例如:

输入:澳大利亚伦敦

规则: 1-%IR%,澳大利亚 2-美国伦敦 3-英国,加拿大

这将返回false

如果我们添加规则London,Austral%或规则Lon%,Australia%,... 这返回true

我该如何实现? Drool是执行此任务的正确工具吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

好吧,现在我已经了解了您的需求,这是解决方案: 我已经写了很多东西和印刷品,以便您可以轻松理解代码。

基本上,我首先将您的规则放入地图中,然后根据用户输入将发送者与接收者分开,如果输入以char“%”结尾,则将其用作通配符。

您可以通过注释/取消注释我在代码中输入的差异输入来测试差异输出。

让我知道:)

HashMap<String,String> map = new HashMap<>();
    map.put("IR", "Australia");
    map.put("London", "US");
    map.put("UK", "CANADA");

    String input = "London, Australia"; //false
//        String input = "Lon%, US"; //true
//        String input = "Lon%, U%"; //true
//        String input = "U%, CANADA"; //true

    StringTokenizer token = new StringTokenizer(input,",");
    String senderInput = token.nextToken();

    System.out.println("Sender:"+senderInput);

    for(String senderMap : map.keySet()){
        boolean firstCondition;
        if(senderInput.endsWith("%")) {
            String senderMatch = senderInput.replace("%", "");
            firstCondition = senderMap.startsWith(senderMatch);
        }else {
            firstCondition = senderMap.equals(senderInput);
        }

        if(firstCondition){
            System.out.println("Sender matched with "+senderMap);
            String receiverInput = token.nextToken().replaceAll(" ","");
            System.out.println("Receiver:"+receiverInput);
            String receiverMap = map.get(senderMap);

            boolean secondCondition;
            if(receiverInput.endsWith("%")) {
                String receiverMatch = receiverInput.replace("%", "");
                secondCondition = receiverMap.startsWith(receiverMatch);
            }else {
                secondCondition = receiverMap.equals(receiverInput);
            }

            if(secondCondition){
                System.out.println("MATCHING!");
            }else{
                System.out.println("NOT MATCHING!");
            }
        }
    }