开源一个java写的英语工具 (JavaFx)

简介

看过我的文章应该知道,我喜欢写一些实际的东西,这里来介绍一个简单的英语工具。这个工具由英译汉、英译英部分和英语闯关识记两大部分构成。

这个工具的语言为Java,使用的GUI框架为JavaFx,如果不会没关系,只要掌握了方法,你也可以用你习惯的语言、框架实现。

翻译功能展示和闯关功能展示:
在这里插入图片描述

配合闯关功能识记单词:

在这里插入图片描述

获取及使用方法、软件自定义

github开源地址:https://github.com/Iamttp/MyUtil

如果想直接使用,你也可以下载我上传到CSDN的资源,我尽量定的最低积分(0积分): https://download.csdn.net/download/qq_40515692/12280276

一个帮助英语学习的工具。

使用方法:

Ctrl + Q: 唤出\后置单词查询窗口

Ctrl + Z: 退出程序

Ctrl + A: 单词检验窗口

Ctrl + X: 退出单词检验

Ctrl + C: 简易记事本

原理及自定义:

  1. 查询的单词来源有两个:
  • 英汉 a.txt
  • 英英 dict.txt

可以通过修改相应文件,修改查询结果

查询方式为java的Contain。

  1. 查询单词的读音和句子意思时:

用到的为有道http接口。

  1. 测试单词有一个来源:
  • 英汉 a.txt

和查询单词有相同的来源。

修改文件后,运行Pre文件夹的SortWord代码,生成单词相似度文件p___.txt

同组单词的选取方式为Levenshtein 距离

这样就完成自定义单词测试功能了。

源码介绍

文件介绍

在这里插入图片描述
com.melloware.jintellitype 里面的.dll文件 保存 jintellitype-1.3.9.jar 所需环境

Pre 存放软件使用前运行的程序。SortWord 会将单词文件的单词解析,得到和该单词最相近的三个单词。这样在单词测试时就可以有三个和单词最像的干扰选项了。

sample 存放主要代码。 Main 文件是JavaFx入口函数,调用了sample.xml作为GUI的定义。MyRect 尚在测试,Note 文件是简易记事本实现文件,调用sample2.xml作为GUI定义。Util 文件为一些通用的工具。Word 文件存放单词管理。sample.css存放GUI格式定义,如隐藏滚动条等。

6.gifREADME.md为帮助文件,a.txt为英汉词典、dict.txt为英英词典、pa.txt为处理得到的相近单词词典。

单词查询部分

这部分可以参考我之前的文章:
https://blog.csdn.net/qq_40515692/article/details/104602531

单词测试部分

首先讲解SortWord,它的任务就是保存单词的最相近3个单词。

处理前(a.txt):
在这里插入图片描述
处理后(pa.txt),保存相近单词行数(忽略空内容):
在这里插入图片描述
这里的核心自然是如何求两个单词的最小距离,刚好网上有一个叫做编辑距离的算法,这个算法竟然有动态规划的思想太炫了!这里参考了网上的一些解释:

编辑距离 (Levenshtein Distance算法)
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:

删除一个字符 a) Insert a character
插入一个字符 b) Delete a character
修改一个字符 c) Replace a character

  1. 当其中某个字符串长度为0的时候,编辑距离就是另一个字符串的长度. (我们可以理解为, 对长度为0的字符串一直插入字符变成另一个字符串),边界
  2. 当字符串不等的时候,我们从字串开头开始看:
    那么A[0] == B[0];的时候, dif[i][j] = dif[i - 1][j - 1]
    而A[0] != B[0];的时候:
  • dif[i][j] = dif[i - 1][j - 1] + 1 —— dif[i - 1][j - 1]+修改当前字符相等1次操作
  • dif[i][j] = dif[i][j - 1] + 1—— dif[i - 1][j - 1]+前面添加一个相等字符1次操作
  • dif[i][j] = dif[i - 1][j] + 1—— 同上

所以代码就是:

	public static float levenshtein(String str1, String str2) {
        //计算两个字符串的长度。
        int len1 = str1.length();
        int len2 = str2.length();
        //比字符长度大一个空间
        int[][] dif = new int[len1 + 1][len2 + 1];
        //赋初值,步骤B。
        for (int a = 0; a <= len1; a++) {
            dif[a][0] = a;
        }
        for (int a = 0; a <= len2; a++) {
            dif[0][a] = a;
        }
        //计算两个字符是否一样,计算左上的值
        int temp;
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                //取三个值中最小的
                dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
                        dif[i - 1][j] + 1);
            }
        }
        //计算相似度
        float similarity = 1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());
        return similarity;
    }

    //得到最小值
    public static int min(int... is) {
        int min = Integer.MAX_VALUE;
        for (int i : is) {
            if (min > i) {
                min = i;
            }
        }
        return min;
    }

然后就是比较每个单词了,时间复杂度有点高是O(N*N*m*m),N表示词典里面的单词数,m表示单词平均长度,但是是提前处理得到文件的,所以不影响软件使用。

然后就是一些逻辑代码和GUI处理了,可以去github上查看,如果github网慢的话,欢迎评论留言,我把代码附上(主要担心文章太长吓到些人),其实相信自己,做一些小工具自己用完全没问题,Just do it!

发布了44 篇原创文章 · 获赞 94 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40515692/article/details/105176337
今日推荐