Как проверить номер телефона (формат США) на Java? - PullRequest
1 голос
/ 21 апреля 2010

Я просто хочу знать, где я здесь не прав:

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);

            }

    }

Ответы [ 4 ]

3 голосов
/ 21 апреля 2010

Если это не домашняя работа, есть ли причина, по которой вы избегаете регулярных выражений?

Вот несколько полезных: http://regexlib.com/DisplayPatterns.aspx?cattabindex=6&categoryId=7

В целом, ваш код, кажется, не подтверждает, что у вас есть номер телефона, он просто подтверждает, что ваши строки состоят только из цифр. Вы также не разрешаете никаких специальных символов прямо сейчас.

1 голос
/ 21 апреля 2010

Может быть, это излишне, но с грамматикой, похожей на:

<phone_numer> := <area_code><space>*<local_code><space>*<number> |
                 <area_code><space>*"-"<space>*<local_code><space>*"-"<space>*<number>
<area_code>   := <digit><digit><digit> | 
                 "("<digit><digit><digit>")"
<local_code>  := <digit><digit><digit>
<number>      := <digit><digit><digit><digit>

вы можете написать парсер рекурсивного спуска. См. эту страницу для примера.

1 голос
/ 21 апреля 2010

Помимо предположения о регулярном выражении (которое является хорошим), представляется более целесообразным иметь дело с массивами из символов , а не со строками с одним символом.

В частности, split("") вызов (дрожь) можно / нужно заменить на toCharArray(). Это позволяет вам перебирать каждого отдельного символа, что более четко указывает на ваши намерения, менее подвержено ошибкам, поскольку вы знаете , что вы обрабатываете каждый символ одновременно, и более эффективно *. Точно так же ваши действительные наборы символов также должны быть символами.

Ваша логика довольно странно выражена; вы даже не ссылаетесь на набор specialChars, и логика зацикливания, когда вы нашли совпадение, кажется странной. Я думаю, что это ваша ошибка; совпадение кажется неправильным в том смысле, что если символ соответствует действительному символу first , вы устанавливаете флаг на 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" будут действительны, потому что все отдельные символы допустимы), но и ваш исходный код тоже не подходит. Регулярное выражение лучше, потому что оно позволяет вам указать шаблон, я приведу приведенный выше фрагмент в качестве примера более ясного способа перебора символов.

* Да, преждевременная оптимизация - корень всего зла, но когда лучше , чище код также оказывается быстрее, это дополнительный выигрыш бесплатно.

0 голосов
/ 21 апреля 2010

Вы можете получить класс Pattern в Java, действительно легко работать с регулярными выражениями, используя этот класс: http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...