数字到单词映射,令人振奋的记忆突发奇想?

时间:2012-09-25 05:28:31

标签: java java-ee logic

我需要帮助来完成这个小项目

程序会将电话号码作为输入并将其转换为正确的英语单词。

阐释: 在前十行中有一些与0-9中数字相关的字母保存在文本文件中,类似于

1 akl
2 dgh
3 qnm
4 rtu
5 zx
6 cvf
7 eip
8 wjs
9 yb
0 o

在第11行,总字数为i-e 50000 之后,从第12行开始,所有50000个单词都存在;每行一个字。 现在,程序将使用数字作为输入表单用户,直到用户输入-1

然后从该文本文件生成正确的英文匹配单词。每个字母代表列表中的一个数字。

例如用户输入 6182703

输出将是: 时尚

对于超过1个匹配的单词,系统会列出所有单词连字符' - '分隔。

我应该如何开始这个,我应该使用什么方法? 如果有人给出了伪代码或提示......那真的很棒。

2 个答案:

答案 0 :(得分:2)

我会根据您的需要获取单词词典并将其排序。

例如:

apple = 17717

cherry = 627449

然后使用搜索算法浏览文件。

编辑:或者您可以将数据存储在关系数据库(http://hsqldb.org/很简单)中,以避免更大的内存占用。如果您喜欢该解决方案,您还可以调查一些键/值存储等。

答案 1 :(得分:2)

您的问题中的许多细节都与输入规范有关,这非常简单。

在解析输入后,您将获得一个“候选”单词列表(所有单词),以及数字到可以表示的字符集的映射。

List<String> words;
Map<Character, Set<Character>> digitMapping;

为数字生成单词的最简单方法可能是:顺序过滤候选列表,测试它们是否与输入数字匹配,否则删除它们。像这样的东西可能会成功(考虑这个伪代码 - 我还没有尝试过编译它):

List<String> getMatches(String inputDigits) {
    // Take a copy of the word list.  You don't want to ruin the list for the next caller
    List<String> candidates = new ArrayList<String>(words); 

    for (Iterator<String> it = candidates.iterator(); it.hasNext() && !candidats.isEmpty(); ) {
        String candidate = it.getNext();
        for (int i = 0; i < inputDigits.length; ++i) {
            Character c = new Character(candidate.charAt(i));
            Character d = new Character(inputDigits.charAt(i));
            if (!digitMapping.get(d).contains(c)) {   
                it.remove();
            }
         }
     }

     return candidates;
}

它将返回所有匹配的单词,因此在您的示例中,“555”可能会返回一个空列表。 “6182703”可能只返回一个单词“fashion”,而“202”可能会返回列表中的几个单词(“dog”,“hog”,“god”)。您需要决定如何处理零和多个案例。

编辑:有关填充digitMapping的详细信息

digitMapping类似于:

Map<Character, Set<Character>> digitMapping = new HashMap<Character, Set<Character>>();

然后你需要从输入中获取一个char和一个String。对于输入行“1 akl”,您的char将为“1”,而您的String将为“akl”。您将字符映射到字符串中的字符集,因此需要构造一个空集,将其放入映射中,然后填充集。有点像(再一次,我甚至没有尝试过编译这个,所以带上一粒盐):

private void addDigitToMap(char digit, String chars) {
    Set<Character> set = new HashSet<Character>();
    digitMapping.put(set);
    for (char c : chars.toCharArray()) {
        set.add(new Character(c));
    }
 }

所以现在地图将有一个条目,指向一组可以表示的字符。