一尘不染

如何将字母数字电话号码转换为数字

algorithm

更新:

我的实用程序的最终版本如下所示:

StringBuilder b = new StringBuilder();

for(char c : inLetters.toLowerCase().toCharArray())
{
    switch(c)
    {
    case '0':                                          b.append("0"); break;
    case '1':                                          b.append("1"); break;
    case '2': case 'a': case 'b': case 'c':            b.append("2"); break;
    case '3': case 'd': case 'e': case 'f':            b.append("3"); break;
    case '4': case 'g': case 'h': case 'i':            b.append("4"); break;
    case '5': case 'j': case 'k': case 'l':            b.append("5"); break;
    case '6': case 'm': case 'n': case 'o':            b.append("6"); break;
    case '7': case 'p': case 'q': case 'r': case 's':  b.append("7"); break;
    case '8': case 't': case 'u': case 'v':            b.append("8"); break;
    case '9': case 'w': case 'x': case 'y': case 'z':  b.append("9"); break;
    }
}

return builder.toString();

原始问题:

我正在执行将字母数字电话号码转换为数字字符串的简单任务。例如,1-800-HI-
HAXOR将变为1-800-44-42967。我最初的尝试是创建一个讨厌的switch语句,但是我希望有一个更优雅,更有效的解决方案。这是我得到的:

for(char c : inLetters.toLowerCase().toCharArray())
{
    switch(c)
    {
    case '0':                                         result+="0"; break;
    case '1':                                         result+="1"; break;
    case '2': case 'a': case 'b': case 'c':           result+="2"; break;
    case '3': case 'd': case 'e': case 'f':           result+="3"; break;
    case '4': case 'g': case 'h': case 'i':           result+="4"; break;
    case '5': case 'j': case 'k': case 'l':           result+="5"; break;
    case '6': case 'm': case 'n': case 'o':           result+="6"; break;
    case '7': case 'p': case 'q': case 'r': case 's': result+="7"; break;
    case '8': case 't': case 'u': case 'v':           result+="8"; break;
    case '9': case 'w': case 'x': case 'y': case 'z': result+="9"; break;
    }
}

谢谢!


阅读 395

收藏
2020-07-28

共1个答案

一尘不染

switch语句并不是真的那么糟糕。您的算法相对于电话号码的长度是线性的。该代码可读性强,很容易通过检查进行验证。除了添加一个default处理错误的案例外,我不会搞砸它。(我不是Java程序员,所以如果我叫其他名字,请原谅我。)

如果 必须 使其更快,则按字符索引的预初始化表将避免除基本错误检查之外的任何比较。您甚至可以通过复制表(digit['A'] = digit['a'] = "2";)中的值来避免大小写转换。初始化表格的费用将在转化总数中摊销。

2020-07-28