我只想知道我在哪里错了:

import java.io.*;


    class Tokens{
            public static void main(String[] args)
            {
               //String[] result = "this is a test".split("");

                String[] result = "4543 6546 6556".split("");
                boolean flag= true;

                String num[] = {"0","1","2","3","4","5","6","7","8","9"};
                String specialChars[] = {"-","@","#","*"," "};


                for (int x=1; x<result.length; x++)
                {
                    for (int y=0; y<num.length; y++)
                    {
                        if ((result[x].equals(num[y])))
                        {
                            flag = false;
                            continue;

                        }
                        else
                        {
                            flag = true;
                        }


                        if (flag == true)
                        break;

                    }

                if (flag == false)
                break;

                }

                System.out.println(flag);

            }

    }

最佳答案

除了正则表达式建议(这是一个很好的建议)之外,处理字符数组而不是单字符字符串似乎更有意义。

特别是,split("")呼叫(抖动)可以/应该由toCharArray()代替。这样,您就可以遍历每个单独的字符,从而更清楚地表明您的意图,因为您知道一次要处理每个字符,因此不容易出现错误,并且效率更高*。同样,您的有效字符集也应该是字符。

您的逻辑很奇怪地表达出来;您甚至根本没有引用specialChars设置,一旦找到匹配项,循环逻辑就显得很奇怪。我认为这是您的错误;这种匹配似乎是错误的,因为如果字符与第一个有效字符匹配,则将标志设置为false并继续当前循环;因此它绝对不会与下一个有效字符匹配,因此您会使用true标志退出循环。总是。

我本以为这样的事情会更直观:

private static final Set<Character> VALID_CHARS = ...;

public boolean isValidPhoneNumber(String number)
{
    for (char c : number,toCharArray())
    {
        if (!VALID_CHARS.contains(c))
        {
           return false;
        }
    }

    // All characters were valid
    return true;
}


这不会考虑序列(例如,字符串“ -------- **”和“ 1”将是有效的,因为所有单个字符都有效),但是原始代码也不会。正则表达式更好,因为它可以让您指定模式,我提供了以上代码段,作为更清晰的字符迭代方式的示例。

*是的,过早的优化是万恶之源,但是,更好的话,更干净的代码也会变得更快,这是免费的。

关于java - 如何用Java验证电话号码(美国格式)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2684517/

10-09 12:36