单词默写助手实现
1、设计思路
1.1、步骤一:创建单词默写测试类SpellTest(主功能类)
根据单词的特性,在存储单词上我使用了HashMap来作为容器,词意与拼写正好组合成一对,为了便于遍历,我使用了List集合来存储这些装有词汇的容器,当需要使用时,直接遍历即可。
1.1.1、功能1:添加单词
添加单词我设计了两种方式,一种是根据字符串添加词意和拼写;另一种是使用word类对单词进行封装。如下:
/**
* 根据拼写和词意添加一个单词
* @param spell 全拼写
* @param meaning 词意
*/
public void addWord(String spell,String meaning){
Map<String, String> map = new HashMap<String, String>();
map.put(meaning,spell);
wordList.add(map);
}
/**
* 根据单词对象添加一个单词
* @param word 单词对象
*/
public void addWord(Word word){
wordList.add(word.convertMap());
}
每添加一个单词,都将其封装成map对象存入wordList集合当中去。
1.1.2、功能二:默写测试
有了词组之后我们就可以开始默写测试了,其实不考虑其他,只要求默写的话到这一步我们的程序就基本完成了。我们直接对wordList集合进行遍历即可。如下:
public void test(){
System.out.println("=====================开始测试:");
//遍历词组
for (int i=0;i<wordList.size();i++){
//获取当前词汇的key --> 词意meaning
Object[] whole = wordList.get(i).keySet().toArray();
System.out.println((i+1)+"——>"+whole[0]);
//拼写
wordSpell = sc.next();
//将控制台输入的单词拼写与词组里的词汇进行比较
if (wordList.get(i).get(whole[0]).equals(wordSpell)){
System.out.println("拼写正确"+"\n"+"================================");
}else{
System.out.println("拼写错误"+"\n"+"================================");
}
}
但是仅仅这样的话测完了之后我们还得一个个往上翻,去找自己写错的单词,这样就比较麻烦了,所以我们可以用一个数组专门来存储拼写错误的单词的索引,这样一来,我们就可以在测试结束的时候利用数组中的索引从wordList容器中将写错的单词提取出来,使默写情况清晰的展示出来。当然,这种方式最后取出来的词并不是我们实际默写的单词,所以无法得知具体是怎么错了,如果希望展示错误的拼写情况,可以另外创建一个集合用于存储我们默写的单词,然后再根据索引将其取出,或者说只存取拼写错误情况下的词汇,只不过相较于前一种方式,在展示编号的时候后者可能相对麻烦一些。又或者说,我认为总是创建新的容器来存储很耗费空间,那么,我们也可以继续使用wordList这个容器,这个容器原先存储的是我们需要默写的词汇,假设它有5个词,那么在测试时,当它的词汇输出之后,我们需要从控制台输入这个单词的拼写,如果匹配不成功,那我们就可以用拼写错误的单词去覆盖当前正确的单词,并追加错误标志,以便展示时方便识别。说了这么多,也只是想告诉各位,一个程序的实现方式可以有很多,关键在于你怎么去思考,不要只纠结结果,思考的过程才是最重要的。
代码如下:
//测试
public void test(){
System.out.println("=====================开始测试:");
//遍历词组
for (int i=0;i<wordList.size();i++){
//获取当前词汇的key --> 词意meaning
Object[] whole = wordList.get(i).keySet().toArray();
System.out.println((i+1)+"——>"+whole[0]);
//拼写
wordSpell = sc.next();
//将控制台输入的单词拼写与词组里的词汇进行比较
if (wordList.get(i).get(whole[0]).equals(wordSpell)){
System.out.println("拼写正确"+"\n"+"================================");
count++;//计数菌
}else{
System.out.println("拼写错误"+"\n"+"================================");
//存储当前错误词汇在词组中的索引值
fault[faultIndex++] = count;
faultCount++;//错误+1
count++;//计数菌
}
}
System.out.println("错误个数:"+faultCount);
//当出现错误时,将错误的词汇显示出来
if (faultCount>0){
System.out.println("本次拼写错误如下:");
showAllFalutWord();
}
}
1.1.3、功能三:单词词源设置
单词词源设置,就是设置单词的来源,这里我设计了三种方式:自定义填充、手动填充以及外部导入。
- 自定义填充:相对于初始化方法,在里面进行单词的添加操作,用于设置一些经常忘记的词汇,以助于记忆。
- 手动填充:就是利用循环去手动输入要测试的词汇,然后再测试
(每次都要输入一遍,特别麻烦,当时觉得手动输入的过程中也能够帮助记忆,现在想想真是蛋疼QAQ)
- 外部导入:和自定义填充类似,只不过将数据放在了其他的类里面,这样更加方便管理,主要用于每日单词的默写。
1.1.4、 SpellTest类完整代码
package word;
import java.util.*;
/**
* @Author: 黑虎阿福
* @Date: 2021/12/5 10:33
* @Version: 1.0
*/
public class SpellTest {
//单词集合
List<Map<String,String>> wordList;
static Scanner sc = new Scanner(System.in);
//单词拼写:用于test使用
String wordSpell;
//拼写失误的单词集合
int fault[] = new int[100];
//记录错误个数
int faultCount = 0;
//记录错误索引
int faultIndex = 0;
//用于遍历计数
int count = 0;
public SpellTest(){
wordList = new ArrayList<Map<String,String>>();
}
public SpellTest(String spell, String meaning){
this();
addWord(spell,meaning);
}
public SpellTest(Word word){
this();
addWord(word);
}
/**
* 根据拼写和词意添加一个单词
* @param spell 全拼写
* @param meaning 词意
*/
public void addWord(String spell,String meaning){
Map<String, String> map = new HashMap<String, String>();
map.put(meaning,spell);
wordList.add(map);
}
/**
* 根据单词对象添加一个单词
* @param word 单词对象
*/
public void addWord(Word word){
wordList.add(word.convertMap());
}
/**
* 获取拼写错误的单词个数
*/
public int getFaultCount(){
return faultCount;
}
/**
* 获取所有的错误拼写单词
*/
public void showAllFalutWord(){
// //如果第一个单词错误处理标志
// int flag = 0;
for (int i = 0;i < faultCount; i++){
System.out.println((fault[i]+1)+"——>"+wordList.get(fault[i]));
// if (fault[i]!=0)
// System.out.println((fault[i]+1)+"——>"+wordList.get(fault[i]));
// else if (flag!=1 && fault[i]==0) {
// System.out.println((fault[i]+1)+"——>"+wordList.get(fault[i]));
// flag = 0;
// }else {
// break;
// }
}
}
//测试
public void test(){
System.out.println("=====================开始测试:");
//遍历词组
for (int i=0;i<wordList.size();i++){
//获取当前词汇的key --> 词意meaning
Object[] whole = wordList.get(i).keySet().toArray();
System.out.println((i+1)+"——>"+whole[0]);
//拼写
wordSpell = sc.next();
//将控制台输入的单词拼写与词组里的词汇进行比较
if (wordList.get(i).get(whole[0]).equals(wordSpell)){
System.out.println("拼写正确"+"\n"+"================================");
count++;//计数菌
}else{
System.out.println("拼写错误"+"\n"+"================================");
//存储当前错误词汇在词组中的索引值
fault[faultIndex++] = count;
faultCount++;//错误+1
count++;//计数菌
}
}
System.out.println("错误个数:"+faultCount);
//当出现错误时,将错误的词汇显示出来
if (faultCount>0){
System.out.println("本次拼写错误如下:");
showAllFalutWord();
}
}
//创建测试类对象
static SpellTest spellTest = new SpellTest();
//手动填充
public static void nonautomatic(){
String spell = "";
String meaning = "";
int i = 0;
while (i<2){
System.out.println("请填充要默写的单词==================");
System.out.print("spell:");
spell = sc.next();
System.out.print("meaning:");
meaning = sc.next();
spellTest.addWord(new Word(spell,meaning));
i++;
}
//测试
spellTest.test();
}
//引入外部填充
public void introduceExternal(List<Map<String,String>> wordList){
this.wordList = wordList;
//测试
spellTest.test();
}
public static void main(String[] args) {
//nonautomatic();//手动填充
//auto();//自定义填充
spellTest.introduceExternal(new DailyVocabulary().day3());//引入外部填充
}
//自定义填充
public static void auto(){
spellTest.addWord("obligition","n.责任,义务");
spellTest.addWord("praise","赞赏、赞美、赞扬");
spellTest.addWord("already","adv.已经");
spellTest.addWord("plane","n.平面、飞机; v.滑翔; adj.平坦的");
spellTest.addWord("grade","n.等级、品级、级别、 v. 分级、分等、给(某个职位)评定级别");
spellTest.addWord("degree","n.度、程度、级别、度数(温度单位)");
spellTest.addWord("spade","n.铲、锹; v.拿铲子铲、拿铲刀铲开");
spellTest.addWord("instance","n.实例、例子; v.举...为例 ");
spellTest.addWord("deposit","v.放下、放置、存钱、使(沉淀)、(使)沉积; n. 存款、押金、订金、堆积物");
spellTest.addWord("apology","n.道歉、辩护、辩解");
spellTest.addWord("universal","n.普遍的、通用的、全世界的");
spellTest.addWord("devote","v.致力、献身、倾注");
spellTest.addWord("sell","n.让人失望的东西; v. 出让、转让、出售、售卖 ; adj.出售的、销路好的");
spellTest.addWord("respectively","adv.各自地、分别地");
spellTest.addWord("prosperous","adj.繁荣的、成功的、兴旺的");
spellTest.addWord("police","n.警察、警察部门 v.监督、巡察、维护治安、管制");
spellTest.addWord("truck","n.卡车、拖车 v. 开卡车、用卡车运");
spellTest.addWord("thirsty","adj.渴望的、渴求的、口渴的、干旱的");
spellTest.addWord("nose","n.鼻子、机头、嗅觉、 v. 小心翼翼的向前移动、拱");
spellTest.addWord("sport","n.体育运动 v.炫耀、卖弄、嬉戏");
spellTest.addWord("bedroom","n.卧室 adj.两性关系的");
spellTest.addWord("shake","n.摇动、抖动、颤动、颤抖 v.摆脱、动摇、摇动");
spellTest.addWord("chapter","n.篇章、回; v.把...分成章节");
spellTest.addWord("seize","v.抓住、捉拿、夺、没收");
spellTest.addWord("refuse","n.废物、垃圾; v.拒绝、回绝");
spellTest.addWord("logic","n.逻辑、逻辑学、思维方式");
spellTest.addWord("penny","n.分、便士");
spellTest.addWord("towel","n.毛巾、手巾、纸巾; v.用毛巾擦干");
spellTest.addWord("safety","n.安全、安全性、平安");
spellTest.addWord("communication","n.传达、传递、传播、通信、通讯、交际、交往、交流、联系、消息、书信");
spellTest.addWord("superficial","adj.肤浅的、表面的、表层的、外面的");
spellTest.addWord("our","adv.我们的用于称上帝或圣人; pron.我们的");
spellTest.addWord("variety","n.品种、变化、多样化");
spellTest.addWord("question","n.问题、疑问; v.问、怀疑、质询");
spellTest.addWord("clockwise","adv.顺时针方向地; adj.顺时针方向的");
spellTest.addWord("principle","n.原则、原理、基本观念、道德原则");
spellTest.addWord("finish","n.抛光、结局、结尾; v.完成、做好");
spellTest.addWord("minority","n.少数派、少数群体、少数民族");
spellTest.addWord("desease","n.病、疾病、恶疾");
spellTest.addWord("lot","n.批、命运、全部、全体; pron.许多、大量; adv.非常(与动词连用)、许多、大量; v.抽签、划分");
spellTest.addWord("or","conj.或者、否则、不然;");
spellTest.addWord("anyway","adv.无论如何、不管怎样");
spellTest.addWord("dose","n.一次、一剂(药的)、一份、剂量、服用量; v.给(某人)服药");
spellTest.addWord("fat","n.肥肉、脂肪; adj.肥的、肥胖的、厚的、宽大的; v.养肥");
spellTest.addWord("senate","n.参议院(美国、加拿大等国家的两个立法机构之一)");
spellTest.addWord("victory","n.胜利");
spellTest.addWord("concentrate","v.专心于、集中、全神贯注、聚集");
spellTest.addWord("recognition","n.认出、识别、承认、认可");
//开始测试
spellTest.test();
}
}
1.2、步骤二:创建单词Word类
主要用于对单词的封装,便于后期我们对单词添加其他特性,例如词性、用法等等。目前在程序中仅用于对单词封装。
package word;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: 黑虎阿福
* @Date: 2021/12/5 10:35
* @Version: 1.0
*/
public class Word {
String spell;
String meaning;
public Word() {
}
public Word(String spell, String meaning) {
this.spell = spell;
this.meaning = meaning;
}
public void setSpell(String spell) {
this.spell = spell;
}
public void setMeaning(String meaning) {
this.meaning = meaning;
}
public String getSpell() {
return spell;
}
public String getMeaning() {
return meaning;
}
public Map convertMap(){
Map<String, String> map = new HashMap<String, String>();
map.put(meaning,spell);
return map;
}
@Override
public String toString() {
return "Word{" +
"spell='" + spell + '\'' +
", meaning='" + meaning + '\'' +
'}';
}
}
1.3、步骤三:创建每日词汇类DailyVocabulary
主要用于对每日词汇的管理,同样使用List集合存储词汇,使用Map存储单个单词,通过不同的方法添加每天需要背的单词,当我们需要复习前面的单词时也可以同时调用不同时期的添加单词的方法,以此达到阶段性的复习。
package word;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: 黑虎阿福
* @Date: 2021/12/5 15:41
* @Version: 1.0
*/
//每日词汇
public class DailyVocabulary {
//每日词组
List<Map<String,String>> wordGroup;
public DailyVocabulary(){
wordGroup = new ArrayList<Map<String, String>>();
}
//添加迟到到词组中
public void add(String spell,String meaning){
Map<String,String> words = new HashMap<String, String>();
words.put(spell,meaning);
wordGroup.add(words);
}
/**
* @Date 2021/12/5
* @return 词组集合
*/
public List<Map<String,String>> day1(){
add("n.长袍、法衣; v.对付、成功应付、妥善处理、竞争、斗争","cope");
add("n.(一)条、一条面包、长方形的一大块; v.游荡、闲逛、闲混、虚度","loaf");
add("n.人、人员、个人、某人","person");
add("n.任命、委派、约会、预约、职务、职位","appointment");
add("n.连接处、接合点; v.加入、参加","join");
add("prep.(与动词连用、表示朝某处或某位置运动) 向、朝向","onto");
add("n.缆绳、钢索、电缆、电报; v.发电报","cable");
add("n.危机、危急关头","crisis");
add("n(v).崇敬、崇拜(神)、敬仰、热爱","worship");
add("adj.较低的、南部的、【地质学、地理学】早期的、下游的; v.降低、减少","lower");
add("adj.巨大的、极多的、程度高的、非常成功的","huge");
add("adj.潜在的、可能的; n.潜力、潜能、潜在性、可能性","potential");
add("n.饥饿、饥荒、渴求、饥饿感; v.饥饿、使饥饿","hunger");
add("n.压力、紧迫、紧张、强调、重要性; v.着重、强调、重读","stress");
add("n.护理、照顾、小心、照料; v.关心、关怀、关注","care");
add("n.期望、期待、预期","expectation");
add("n.云、云朵、阴影、一团; v.使难以理解、使记不清楚","cloud");
add("n.疯子; adj.精神的、心理的、脑力的","mental");
add("n.结石、宝石、岩石; v.向..投石头; adj.石制的; adv.石一般的","stone");
add("n.[人名]尼斯; adj.令人愉快的、吸引人的","nice");
add("n.夏季、夏天; v.避暑、使度过夏季; adj.夏季的","summer");
add("n.护照、通行证","passport");
add("n.核心、精髓; adj.最重要的、主要的、基本的、核心的; v.去掉(水果)的果心","core");
add("n.无限、无尽的事务; adj.无限的、无穷无尽的","infinite");
add("n.家庭教师、私人教师; v.教、任课","tutor");
return wordGroup;
}
/**
* @Date 2021/12/4
* @return 词组集合
*/
public List<Map<String,String>> day2(){
add("n.最终的事物、基本事实; adj.最后的、最终的","ultimate");
add("n.千、无数; adj.千、无数的","thousand");
add("n.(正式)先生、绅士、正人君子","gentleman");
add("n.奖励、回报、报酬; v.奖励、奖赏、给予报酬","reward");
add("n.鼓、滚筒; v.击鼓、打鼓、连续敲打","drum");
add("n.政府、政体、内阁","government");
add("n.语言、言语、说话","language");
add("n.胜利","victory");
add("n.现在; adv.现在、目前","nowadays");
add("n.草稿、草图; adj.粗糙的、不平滑的、高低不平的; v.虐待、惹怒; adv.粗鲁地、粗野地","rough");
add("n.欢迎、接待; v.(打招呼)欢迎、迎新; adj.令人愉快的、受欢迎的","welcome");
return wordGroup;
}
/**
* @Date 2021/12/6
* @return 词组集合
*/
public List<Map<String,String>> day3(){
add("n.核武器主义者; adj.原子能的、核能的、核武器的","nuclear");
add("n.染料、燃油; v.加燃料、加油","fuel");
add("n.跳跃、剧增、急变; v.跳跃、越过; adj.闰年的","leap");
add("v.假装、佯装、自称、模拟; adj.假装的、想象的","pretend");
add("n.预防措施、防备","precuation");
add("n.过去、昔日、(某人)过去的经历; adj.过去的、昔日的、刚过去的; prep.超过、晚于、在...之后; adv.经过、逝去; v.'pass'的过去分词","past");
add("n.使尴尬、使窘迫、使为难","embarrass");
add("n.高一或大一新生、新手","freshman");
add("n.醉汉、酒鬼; adj.沉醉、陶醉; v.'drink'的过去分词","drunk");
add("n.威胁、恐吓、危及; v.同'threaten'","threat");
add("adj.缺席的、缺少的、心不在焉的; v.缺席、不参加; prep.没有、缺乏","absent");
add("n.打扫、清扫; adj.洁净的、干净的; v.除去...的灰尘、使干净; adv.完全地","clean");
add("n.清理、清除; adj.清晰的、易懂的; v.使清楚、使清晰; adv.清晰地、清楚地","clear");
add("n.替换物、取舍; adj.可选择的、可替代的","alternative");
add("n.增加、增多; v.增加、增多","increase");
add("n.令人讨厌的人(或事)、内径、口径; v.使厌烦、开凿、挖掘","bore");
add("n.饮料、酒; v.喝、喝酒、饮酒、(尤指)酗酒","drink");
add("n.(事件或活动)带来的收入; v.进行进行、接着做","proceed");
add("n.十四岁、十四的记号; num.十四","fourteen");
add("v.刺激、激励、促使","stimulate");
add("n.人; adj.人的、人本性的有人情味的","human");
add("v.飞、航行; n.苍蝇; adj.机灵的、机紧的","fly");
add("n.法庭、法院、球场、宫廷、求婚; v.追求、求婚","court");
add("v.接受、承认、同意、认可","accept");
add("n.惊讶、惊奇、意外; v.使惊讶、使诧异; adj.出乎意料的","surprise");
return wordGroup;
}
/**
* 阶段复习1
* @return 词组集合
*/
public List<Map<String,String>> phaseReview1(){
day1();
day2();
return wordGroup;
}
}