自定义规则比较器

来源:互联网 发布:gson 生成json 编辑:程序博客网 时间:2024/06/11 00:35
package com.parse.utils;import com.parse.entity.ProtocolCondition;import com.parse.entity.ProtocolEntity;import com.parse.entity.ProtocolEntity;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.*;/** * Created by admin on 2017/8/22. */public class CompareCondition {    /**     * 传入数据:规则,被比较参数     */    private static <T> List<ProtocolCondition> comareTo(List<ProtocolCondition> conditions, T protocolEntity) {        Map<String, String> map = getField(protocolEntity);        List<ProtocolCondition> returnCondition = new ArrayList<ProtocolCondition>();        int i = -1;        for (ProtocolCondition condition : conditions) {            String variable = condition.getVariable();            String operator = condition.getOperator();            String value = condition.getValue();            String connector = condition.getConnector();            String fieldType = condition.getFieldType();//根据实验得知:判断String要比,string转换integer进行compareTo块数倍            ProtocolCondition next = condition.getNext();            for (Map.Entry<String, String> ite : map.entrySet()) {                if (variable.equalsIgnoreCase(ite.getKey())) {                    if (operator.equals("==")) {                        i = value.compareTo(ite.getValue()) == 0 ? 1 : 0;                        if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;                    } else if (operator.equals("!=")) {                        i = value.compareTo(ite.getValue()) != 0 ? 1 : 0;                        if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;                    } else if (operator.equals(">")) {                        i = value.compareTo(ite.getValue()) > 0 ? 1 : 0;                        if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;                    } else if (operator.equals("<")) {                        i = value.compareTo(ite.getValue()) < 0 ? 1 : 0;                        if (parseConnectCondition(returnCondition, i, condition, connector)) return returnCondition;                    }                }            }        }        return returnCondition;    }    /**     * 解析连接符     * @param returnCondition     * @param i     * @param condition     * @param connector     * @return     */    private static boolean parseConnectCondition(List<ProtocolCondition> returnCondition, int i, ProtocolCondition condition, String connector) {        if (connector.equals("|") && i == 1 || connector.equals("")) {            returnCondition.add(condition);            return true;        } else if (connector.equals("&") && i == 1) {            returnCondition.add(condition);        } else if (connector.equals("&") && i == 0) {            return true;        }        return false;    }    /**     * 获取字段名称     * @param clazz     * @param <T>     * @return     */    public static <T> Map<String, String> getField(T clazz) {        Map<String, String> fieldMap = new HashMap<String, String>();        Field[] fields = clazz.getClass().getDeclaredFields();        for (Field field : fields) {            field.setAccessible(true);            try {                fieldMap.put(field.getName(), (String) field.get(clazz));            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }        return fieldMap;    }    /**     * 测试类     * @param args     */    public static void main(String[] args) {        ProtocolEntity p = new ProtocolEntity();        p.setDiff("ipasdf");        p.setIp("192.168.101.141");        p.setName("c");        p.setPort("8081");        ProtocolCondition protocolCondition = new ProtocolCondition();        protocolCondition.setVariable("ip");        protocolCondition.setOperator("!=");        protocolCondition.setValue("192.168.101.140");        protocolCondition.setConnector("|");        ProtocolCondition next = new ProtocolCondition();        next.setVariable("port");        next.setOperator(">");        next.setValue("8080");        protocolCondition.setNext(next);        List<ProtocolCondition> conditions = new ArrayList<ProtocolCondition>();        conditions.add(protocolCondition);        List<ProtocolCondition> protocolConditions = comareTo(conditions, p);        for (ProtocolCondition condition : protocolConditions) {            System.out.println(condition);        }    }}package com.parse.entity;/** * Created by admin on 2017/8/21. * ip.xttl==11&ip.diffrence>1111&ip.proto>44 */public class ProtocolCondition {    public String variable;//变量    public String operator;//运算符    public String value;//变量值    public String fieldType;//0标识Integer  1标识String    public String connector;//连接符    public ProtocolCondition next;//连接符下一个条件    public String getVariable() {        return variable;    }    public void setVariable(String variable) {        this.variable = variable;    }    public String getOperator() {        return operator;    }    public void setOperator(String operator) {        this.operator = operator;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value;    }    public String getConnector() {        return connector;    }    public void setConnector(String connector) {        this.connector = connector;    }    public String getFieldType() {        return fieldType;    }    public void setFieldType(String fieldType) {        this.fieldType = fieldType;    }    public ProtocolCondition getNext() {        return next;    }    public void setNext(ProtocolCondition next) {        this.next = next;    }    @Override    public String toString() {        return "ProtocolCondition{" +                "variable='" + variable + '\'' +                ", operator='" + operator + '\'' +                ", value='" + value + '\'' +                ", fieldType='" + fieldType + '\'' +                ", connector='" + connector + '\'' +                ", next=" + next +                '}';    }}package com.parse.entity;/** * Created by admin on 2017/8/22. */public class ProtocolEntity {    private String ip;    private String port;    private String diff;    private String name;    public String getIp() {        return ip;    }    public void setIp(String ip) {        this.ip = ip;    }    public String getPort() {        return port;    }    public void setPort(String port) {        this.port = port;    }    public String getDiff() {        return diff;    }    public void setDiff(String diff) {        this.diff = diff;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

原创粉丝点击