JAVA一段文字和原文对比 ,在原文中标出错误

因业务需求需要做一个文字对比的功能,在原文中标出错误的地方。网上找了好久,多就是通过分词挑出两个内容中的不同。于是自己写了一个简单工具类,新手代码不是很规则,不懂算法就自己的想法写的,各位大神勿喷,多多指导。

效果图如下


image.png

下面上代码:

public class ResultUtils {

    private static List<WordBean> origlist;
    private static List<String> tarList;
    private static List<WordBean> errorList;
    private static List<String> pinOrigList;

    /**
     * 获取背诵,原文中那些字背错了
     *
     * @param original
     *            原文
     * @param reciteText
     *            背诵的内容
     * @return
     */
    public static List<WordBean> getError(String original, String reciteText) {
        init();
        handleText(original, reciteText);
        return dispose();
    }

    /**
     * 初始化某些集合
     */
    private static void init() {
        origlist = new ArrayList<WordBean>();
        tarList = new ArrayList<String>();
        errorList = new ArrayList<WordBean>();
        pinOrigList = new ArrayList<String>();
    }

    /**
     * 字符串处理
     *
     * @param original
     * @param reciteText
     */
    private static void handleText(String original, String target) {
        // 去除原文和背诵内容中的特殊字符(注:先去掉标点之后再考虑标点问题)
        // original = replaceSpecStr(original);
        target = replaceSpecStr(target);
        // 去除 背诵内容中的数字
//      target = target.replaceAll("\\d+", "");
        // 原文进行单字拆分放入集合
        for (int i = 0; i < original.length(); i++) {
            // 单个文字拆分
            String str = replaceSpecStr(String.valueOf(original.charAt(i)));
            // 对非空文字进行保存
            if (str != null && !"".equals(str)) {
                // 生成对象并保存
                WordBean wBean = new WordBean();
                wBean.setOraIndex(i);
                wBean.setWord(str);
                origlist.add(wBean);
                pinOrigList.add(str);
            }
        }
        // 对背诵内容进行筛选,把原文中存在的字符挑出来
        for (int i = 0; i < target.length(); i++) {
            String str = String.valueOf(target.charAt(i));
            // 转成拼音进行判断
            // 原文集合中存在的文字加入到集合
            if (pinOrigList.contains(str)) {
                tarList.add(str);
            }
        }

        // 原文和背诵内容进行对比,确定原文中文字在背诵内容中的位置
        for (WordBean bean : origlist) {
            for (int i = 0; i < tarList.size(); i++) {
                // 文字相同,确定位置
                if (bean.getWord().equals(tarList.get(i))) {
                    bean.addLocation(i);
                }
            }
        }
    }

    /**
     * 对两个集合进行处理
     */
    private static List<WordBean> dispose() {
        // 挑出对应位置为空的对象
        for (WordBean wordBean : origlist) {
            if (wordBean.getTarIndexs() == null) {
                errorList.add(wordBean);
            }
        }
        // 移除位置为空的对象
        origlist.removeAll(errorList);
        // 多个对应位置的对象集合
        List<WordBean> list = getRepetitionWord();
        // 移除多个对象的
        origlist.removeAll(list);
        // 文字重复的对象集合
        List<WordBean> sriglist = getSingleRepetition(origlist);
        // 移除单个重复对象
        origlist.removeAll(sriglist);
        // 处理剩余单个集合
        disposeOne(origlist);
        for (WordBean wordBean : list) {
            origlist.add(wordBean);
            sort(origlist);
            disposeMore(wordBean, origlist);
        }

        for (WordBean wordBean : sriglist) {
            origlist.add(wordBean);
            sort(origlist);
            disposeMore(wordBean, origlist);
        }
        origlist.addAll(errorList);
        sort(origlist);
        return origlist;
    }

    /**
     * 挑出原文中汉字中,对应位置较多的文字 因为汉字重复所以会产生多个位置
     *
     * @return
     */
    private static List<WordBean> getRepetitionWord() {
        List<WordBean> beans = new ArrayList<WordBean>();
        for (WordBean bean : origlist) {
            if (bean.getTarIndexs() != null && bean.getTarIndexs().size() > 1) {
                beans.add(bean);
            }
        }
        return beans;
    }

    /**
     * 挑出原文中重复的文字
     *
     * @param list
     * @return
     */
    private static List<WordBean> getSingleRepetition(List<WordBean> list) {
        List<WordBean> beans = new ArrayList<WordBean>();
        for (WordBean bean : list) {
            for (WordBean wBean : list) {
                if (bean != wBean && !beans.contains(bean)
                        && bean.getWord().equals(wBean.getWord())) {
                    beans.add(bean);
                }
            }
        }
        return beans;
    }

    /**
     * 对集合中有一个对应位置的文字进行判断处理
     *
     * @param copy
     */
    private static void disposeOne(List<WordBean> copy) {

        for (int i = 0; i <= copy.size() - 1; i++) {
            WordBean bean = copy.get(i);
            if (bean.getTarIndexs() == null) {
                // 当前对象的对应位置为空,结束本层循环
                continue;
            }
            // 获取下一个对象
            WordBean nextBean = getNext(bean, copy);
            if (nextBean == null) {
                continue;
            }
            // 位置对应关系,如果当前对象对应位置大于下一个对象的对应位置,当前对象位置不合理置空
            if (bean.getTarIndexs().get(0) > nextBean.getTarIndexs().get(0)) {
                bean.setTarIndexs(null);
                disposeOne(copy);
            }
        }
    }

    /**
     * 对存在多个对应位置的对象进行处理
     *
     * @param bean
     * @param list
     */
    private static void disposeMore(WordBean bean, List<WordBean> list) {
        // System.err.println(bean.toString());
        int position = list.indexOf(bean);
        // 如果当前对象是对一个对象
        // 判断标记,是否存在合适位置
        boolean isEnd = false;
        if (position == 0) {
            // 获取下一个对象
            WordBean next = getNext(bean, list);
            // 对位置进行遍历判断
            for (Integer in : bean.getTarIndexs()) {
                // 位置关系是当前对应位置小于下一个对象的对应位置
                if (next != null && in < next.getTarIndexs().get(0)) {
                    // 满足关系对对象进行保存,结束循环
                    List<Integer> integers = new ArrayList<Integer>();
                    integers.add(in);
                    bean.setTarIndexs(integers);
                    isEnd = true;
                    break;
                }
            }
        } else if (position == list.size()) {
            // 如果当前位置是最后一个
            WordBean lastBean = getLast(bean, list);
            // 对位置进行遍历判断
            for (Integer in : bean.getTarIndexs()) {
                // 位置关系是当前对应位置大于上一个对象的对应位置
                if (lastBean != null && in > lastBean.getTarIndexs().get(0)) {
                    // 满足关系对对象进行保存,结束循环
                    List<Integer> integers = new ArrayList<Integer>();
                    integers.add(in);
                    bean.setTarIndexs(integers);
                    isEnd = true;
                    break;
                }
            }
        } else {
            // 当前位置是中间位置
            WordBean lastBean = getLast(bean, list);
            WordBean nextBean = getNext(bean, list);
            // 遍历对应位置
            for (Integer in : bean.getTarIndexs()) {

                // 位置对应关系,大于上一个,小于下一个
                if (lastBean != null && nextBean != null
                        && in > lastBean.getTarIndexs().get(0)
                        && in < nextBean.getTarIndexs().get(0)) {
                    // 满足关系对对象进行保存,结束循环
                    List<Integer> integers = new ArrayList<Integer>();
                    integers.add(in);
                    bean.setTarIndexs(integers);
                    isEnd = true;
                    break;
                }
            }
        }

        // 没有合适的位置对应。置空
        if (!isEnd) {
            bean.setTarIndexs(null);
        }

    }

    /**
     * 获取当前文字对象,上一个有对应位置的对象
     *
     * @param bean
     * @param list
     * @return
     */
    private static WordBean getLast(WordBean bean, List<WordBean> list) {
        int index = list.indexOf(bean);
        WordBean rsultBean = null;
        for (int i = index - 1; i >= 0; i--) {
            if (list.get(i).getTarIndexs() != null) {
                rsultBean = list.get(i);
                break;
            }
        }
        return rsultBean;
    }

    /**
     * 获取当前文字对象,下一个有对应位置的对象
     *
     * @param wordBean
     * @param wBeans
     * @return
     */
    private static WordBean getNext(WordBean wordBean, List<WordBean> wBeans) {
        WordBean bean = null;
        int dex = wBeans.indexOf(wordBean);
        for (int i = dex + 1; i < wBeans.size(); i++) {
            if (wBeans.get(i).getTarIndexs() != null) {
                bean = wBeans.get(i);
                break;
            }
        }
        return bean;
    }

    /**
     * 集合排序,根据在原文中的位置进行排序
     *
     * @param list
     */
    private static void sort(List<WordBean> list) {
        Collections.sort(list, new Comparator<WordBean>() {
            public int compare(WordBean arg0, WordBean arg1) {
                if (arg0.getOraIndex() < arg1.getOraIndex()) {
                    return -1;
                } else if (arg0.getOraIndex() > arg1.getOraIndex()) {
                    return 1;
                }
                return 0;
            }
        });
    }

    /**
     * 正则替换所有特殊字符
     *
     * @param orgStr
     * @return
     */
    private static String replaceSpecStr(String orgStr) {
        if (null != orgStr && !"".equals(orgStr.trim())) {
            String regEx = "[\\s~·`!!@#¥$%^……&*(())\\-——\\-_=+【\\[\\]】{{}}\\|、\\\\;;::‘'“”\",,《<。.》>、/??\n]";
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(orgStr);
            return m.replaceAll("");
        }
        return null;
    }
}
 

bean对象代码

public class WordBean implements Serializable{

private String word;
private List<Integer> tarIndexs;
private int oraIndex;

public String getWord() {
    return word;
}

public void setWord(String word) {
    this.word = word;
}

public List<Integer> getTarIndexs() {
    return tarIndexs;
}

public void setTarIndexs(List<Integer> tarIndexs) {
    this.tarIndexs = tarIndexs;
}

public void addLocation(int index) {
    if (tarIndexs == null)
        tarIndexs = new ArrayList<Integer>();
    tarIndexs.add(index);
}

public void removeLocation(int index) {
    if (tarIndexs == null) {
        return;
    }
    tarIndexs.remove(tarIndexs.indexOf(index));
}

public int getOraIndex() {
    return oraIndex;
}

public void setOraIndex(int oraIndex) {
    this.oraIndex = oraIndex;
}


@Override
public String toString() {
    return "WordBean{" +
            "word='" + word + '\'' +
            ", tarIndexs=" + tarIndexs +
            ", oraIndex=" + oraIndex +
            '}';
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 简介 JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据...
    廖马儿阅读 187评论 0 0
  • 是的 我从来都知道这世上本就没有真正的感同身受 在这个心性 三观都近乎形成的年龄段 最多也只是在此基础上进行修正和...
    好徒徒阅读 327评论 0 0