1

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

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

说明:在文本文件的前十行中,有一些与 0-9 数字相关的字母,例如

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

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

然后从这个文本文件中生成一个适当的英语匹配词。每个字母代表列表中的一个数字。

例如用户输入 6182703

输出将是:时尚

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

我应该如何开始,我应该使用什么方法?如果有人提供伪代码或提示.. 那就太好了。

4

2 回答 2

2

我会拿一本单词词典,并根据您的需要将其分类到一个文件中。

例如:

苹果 = 17717

樱桃 = 627449

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

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

于 2012-09-25T06:24:43.733 回答
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>>();

然后你需要从输入中获取一个字符和一个字符串。对于输入行“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));
    }
 }

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

于 2012-09-25T06:27:17.103 回答