作业帮 > 综合 > 作业

如何把数字转换英文单词,类似手机数字键盘

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 05:48:31
如何把数字转换英文单词,类似手机数字键盘
类似手机数字键盘上:数字1没有英文字母,数字2代表ABC,数字3代表DEF.数字9代表WXYZ
现在我有个含英文单词的words.txt文件,如果我输入"224",输出"bag""cai"(单词在words.txt里),如果单词库words.txt里面没有"bag""cai",则输出"没有匹配"
import java.io.*;
import java.util.*;
public class Q1{
\x05static ArrayList words = new ArrayList();
\x05final static String alphabet = "abcdefghijklmnoprstuvwxyz";
\x05final static String numbers = "222333444555666777888999";
\x05
\x05public static void main(String args[]) throws IOException{
\x05\x05Scanner scanner = new Scanner(new File("words.txt"));
\x05\x05while (scanner.hasNext())
\x05\x05\x05words.add(scanner.next());
\x05\x05String code = new Scanner(System.in).next();
\x05\x05
\x05\x05for (String word :words)
\x05\x05\x05if (code.equals(toNumber(word))){
\x05\x05\x05\x05System.out.println(word);
\x05\x05\x05\x05System.exit(0);
\x05\x05\x05\x05}
\x05\x05
\x05\x05System.out.println("No solution");
\x05\x05}
\x05
\x05public static String toNumber(String word){
\x05\x05String s = "";
\x05\x05for (int i = 0; i < word.length(); i++)
\x05\x05\x05s += numbers.charAt(alphabet.indexOf(word.charAt(i)));
\x05\x05return s;
\x05\x05}
}
这是我目前乱写的,可以的话麻烦帮我改一下,
你这个是考算法的啊!我想到了几点:
1:你要把words.txt单词库中的单词逐个分离出来.这个不难,只要单词库中的单词之间有固定的界限(比如用空格来区分,或是逗号什么的)都可以用java.util.StringTokenizer类来分离.
2:将分离出来的单词存放在ArrayList list中
3:建立英文字母到数字的映射关系:public int index(chat c)//根据输入的char返回对应的数字.不如D/E/F返回3,需要注意的是,大D和小D都返回3.这个不难吧.
4:建立一个单词到数字的映射.public byte[] NOEncoding(String s)用到String类的charAt(int index)方法,逐个提取char,再用index()方法对应的数字来来确定,并将结果存放在byte数组中
5:遍历list链表,利用NOEncoding()方法,建立每个单词到数字的映射,就形成了新的单词库了.
6:最后一步啦,将输入的数字和对应的新的单词库做比较就行了.你的目的达到了.
附:java.util.StringTokenizer
ublic class StringTokenizerextends Objectimplements Enumerationstring tokenizer 类允许应用程序将字符串分解为标记.tokenization 方法比 StreamTokenizer 类所使用的方法更简单.StringTokenizer 方法不区分标识符、数和带引号的字符串,它们也不识别并跳过注释.
可以在创建时指定,也可以根据每个标记来指定分隔符(分隔标记的字符)集.
StringTokenizer 的实例有两种行为方式,这取决于它在创建时使用的 returnDelims 标志的值是 true 还是 false:
如果标志为 false,则分隔符字符用来分隔标记.标记是连续字符(不是分隔符)的最大序列.
如果标志为 true,则认为那些分隔符字符本身即为标记.因此标记要么是一个分隔符字符,要么是那些连续字符(不是分隔符)的最大序列.
StringTokenizer 对象在内部维护字符串中要被标记的当前位置.某些操作将此当前位置移至已处理的字符后.
通过截取字符串的一个子串来返回标记,该字符串用于创建 StringTokenizer 对象.
下面是一个使用 tokenizer 的实例.代码如下:
StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
输出以下字符串:
this
is
a
test
public StringTokenizer(String str,
String delim)为指定字符串构造一个 string tokenizer.delim 参数中的字符都是分隔标记的分隔符.分隔符字符本身不作为标记.
注意,如果 delim 为 null,则此构造方法不抛出异常.但是,尝试对得到的 StringTokenizer 调用其他方法则可能抛出 NullPointerException.
参数:
str - 要解析的字符串.
delim - 分隔符.
抛出:
NullPointerException - 如果 str 为 null.
附2:
我觉得这种思路较好一些:
1>如果建立数字到英文字母的映射,那么一个数字将返回多个字母,这个不是很好吧,不如2--abc.
2>建立数字到单词的映射,算法上不太好实现.比如224,就是abc abc ghi的全排雷,就要3*3*3这么多种,要是中文字还可以接受做多也就4*4*4*4*4这么多.但是英文不同了.
3>你单词库中的单词毕竟是有限的,就拿中文汉字来说,最多也1W左右.英文单词也不过如此.
所以这个不是大问题.
综上,我最终选择了这个算法来实现.
代码之际写吧.应该不存在大问题了.
(回答很辛苦啊,我还差6个最佳答案了!)
再问: 这是我目前乱写的,能帮忙运行看一下错在哪吗?可以的话麻烦帮我改一下,我会追加分
再答: 你要在word.txt中新增加一些单词,用空格来隔开。(java.util.Scanner 扫描器所使用的默认空白分隔符通过 Character.isWhitespace 来识别。不管以前是否更改,reset() 方法将把扫描器分隔符的值重置为默认空白分隔符。) 还有,在alphabet 中少了个q,要添上,7777和9999必须是4个你才3个,斗不起26个英文字母啊。 其他都没问题了,就是那个for()不是很好,每个次都要输出no solution。(要遍历words,如果当前word找到了,就输出出来,如果没有:如果words没有遍历完,继续下一次,如果到尽头,就该输出no solution) 其他的都能行。
再问: 非常感谢,我加了word.txt文件,一个小问题,我有手动打ad ae af,但是我运行输入23只出现ad第一个,请问这个要怎么改?多谢,再次麻烦你了!
再答: 将那个for改一下: int i=0; for(;i