模糊算法

项目实例下载:https://gitee.com/Keith404/fuzzy_algorithm/tree/master/

2018/11/7    16:55 修改

import java.util.ArrayList;
import java.util.List;

public class FuzzyMatching {

    //参数
    private int substrCrossDomain = 2; //子串允许的跨界下标值
    private int substrElimination = 2; //子串允许的消除个数值
    private int mainstrCrossDomain = 100; //主串允许的跨界下标值
    private boolean reportOpen = true; //是否显示汇报结果

    //变量
    private String mainString = ""; //主串字符串
    private String subString = ""; //子串字符串
    private int substrSubscript = 0; //子串下标
    private int subscriptMovementCount = 0; //子串移动下标次数
    private int currentEliminationNumber = 0; //存储消除子串字符的数值
    private int mainstrPreviousSubscript = 0; //主串的前一次下标值
    private boolean effectiveness; //返回值
    private List matchingItem; //符合条件的子串字符集
    private List report; //汇报内容
    private List result; //主串出现位置结果集

    //首字符出现的位置
    private int fistCharShow = -1;

    //是否执行过getResult
    private boolean readGetResult = false;

    //构造方法
    public FuzzyMatching() {
        report = new ArrayList();
        matchingItem = new ArrayList();
        result = new ArrayList();
    }

    public FuzzyMatching(String mainString, String subString) {
        report = new ArrayList();
        matchingItem = new ArrayList();
        result = new ArrayList();
        this.mainString = mainString;
        this.subString = subString;

    }

    //

    //设置主串和子串方法
    public void setMainString(String mainString) {
        this.mainString = mainString;
    }

    public void setSubString(String subString) {
        this.subString = subString;
    }

    //获取主串和子串
    public String getMainString() {
        return this.mainString;
    }

    public String getSubString() {
        return this.subString;
    }

    //设置参数值
    public void setSubstrCrossDomain(int value) {
        this.substrCrossDomain = value;
    }

    public void setSubstrElimination(int value) {
        this.substrElimination = value;
    }

    public void setMainstrCrossDomain(int value) {
        this.mainstrCrossDomain = value;
    }

    public void setReportOpen(boolean value) {
        this.reportOpen = value;
    }

    //返回主串分别出现的数据结果
    public List getResult() {
        if (readGetResult) {
            return this.result;
        } else {
            System.out.println("还没执行getEffectiveness方法");
            return this.result; //有待完善
        }

    }

    //返回匹配到的子串字符
    public List getMatchingItem() {
        if (readGetResult) {
            return this.matchingItem;
        } else {
            System.out.println("还没执行getEffectiveness方法");
            return this.matchingItem; //有待完善
        }
    }


    public Boolean getEffectiveness() {

        for (int i = 0; i < mainString.length(); i++) { if (mainString.charAt(i) == subString.charAt(0)) { if ((mainString.length()-i) > substrElimination){
                    fistCharShow = i;
                    break;
                }
            }
        }

        if (fistCharShow != -1){

        }else {
            substrSubscript++;
            fistCharShow = 0;
        }

        int mainStringSubscript = 0;
        mainStringSubscript = fistCharShow;
        while(mainStringSubscript<mainString.length()){

            subscriptMovementCount = 0;
            for (int j = substrSubscript; j < subString.length(); j++) {
                if (subscriptMovementCount < substrCrossDomain) {
                    if (mainString.charAt(mainStringSubscript) == subString.charAt(j)) {
                        if (mainStringSubscript - mainstrPreviousSubscript < mainstrCrossDomain) { //判断主串下标移动的范围值,如果是第一次匹配,则无穷
                            substrSubscript = j + 1;//将子串下标设置为当前匹配到的下标,并将子串下标移一位
                            matchingItem.add(subString.charAt(j));
                            result.add(mainStringSubscript);
                        } else {
                            report.add("超出主串允许的跨界幅度:" + mainString.charAt(mainStringSubscript));

                        }
                        mainstrPreviousSubscript = mainStringSubscript;
                        break;
                    }

                } else {
                    break;
                }
                subscriptMovementCount++;
                if (j==subString.length()){
                    mainStringSubscript = fistCharShow;
                }


            }

            mainStringSubscript ++;
        }

        for (int i = fistCharShow; i < mainString.length(); i++) { } currentEliminationNumber = subString.length() - matchingItem.size(); //汇报信息处理 String strs = "子串符合主串匹配的字符集为:"; if (currentEliminationNumber > substrElimination) {
            report.add("消除的子串个数超过预设值,所以结果无效");
            effectiveness = false;
        } else {
            report.add("消除的子串个数在预设值内,所以结果有效");
            effectiveness = true;
        }


        for (int i = 0; i < matchingItem.size(); i++) {
            strs += matchingItem.get(i).toString();
        }
        report.add(strs);
        strs = "在主串分别出现的位置为(以0作为起始值):";
        for (int i = 0; i < result.size(); i++) {
            strs += result.get(i).toString() + ",";
        }
        report.add(strs);

        //汇报
        if (reportOpen) {
            for (int i = 0; i < report.size(); i++) {
                System.out.println(report.get(i));
            }
        }
        this.readGetResult = true;
        return effectiveness;
    }


}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值