Как сделать так, чтобы цикл продолжал работать после того, как первое условие вернет true? - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь написать метод, который будет принимать строку, преобразовывать любые буквы в целое и возвращать все преобразованные целые в основную, заменяя буквы.У меня есть операторы if, которые преобразуют все буквы в числа, но у меня возникают проблемы с тем, чтобы он работал с циклом для преобразования всех букв вместо остановки после первой.Любая помощь будет оценена, спасибо заранее.

    public class PhoneNumberChecker
    {
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        // Get the phone number
        System.out.print("Phone number to convert: ");
        String phoneNumber = input.nextLine();
        // Process each character in the phone number for display
        for (int i = 0; i < phoneNumber.length(); ++i)
        {
            // Get the character
            char ch = phoneNumber.charAt(i);
            if (Character.isLetter(ch))                         
                ch = (Character.toUpperCase(ch));               
            else
                System.out.print(ch);               
        }
        System.out.println(getNumber(phoneNumber));
        input.close();
        // end method

    }

    public static String getNumber(String phoneNumber)
    {

        for (int i = 0; i < phoneNumber.length(); ++i)
        {
            char ch = phoneNumber.charAt(i);
            ch = Character.toUpperCase(ch);

            if (ch == 'A' || ch == 'B' || ch == 'C')
                    return "2";         
                else if
                (ch == 'D' || ch == 'E' || ch == 'F')
                    return "3";
                else if
                (ch == 'G' || ch == 'H' || ch == 'I')
                    return "4";
                else if
                (ch == 'J' || ch == 'K' || ch == 'L')
                    return "5";
                else if
                (ch == 'M' || ch == 'N' || ch == 'O')
                    return "6";
                else if
                (ch == 'P' || ch == 'Q' || ch == 'R' || ch == 'S')
                    return "7";
                else if
                (ch == 'T' || ch == 'U' || ch == 'V')
                    return "8";
                else if
                (ch == 'W' || ch == 'X' || ch == 'Y' || ch == 'Z')
                    return "9";

        }
        return "";



}
}

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Я бы посоветовал вам использовать StringBuilder по сравнению с String, так как это предпочтительнее по сравнению со String.Причина в том, что String immutable.Таким образом, внутри цикла объект String будет создаваться снова и снова.Принимая во внимание, что StringBuilder является изменяемым, поэтому он объявляется только один раз, а затем может быть обработан его ссылкой.Вы можете использовать его, как показано ниже:

public static String getNumber(String phoneNumber){

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < phoneNumber.length(); ++i){
        char ch = phoneNumber.charAt(i);
        ch = Character.toUpperCase(ch);

        if (ch == 'A' || ch == 'B' || ch == 'C')
            sb.append("2"); 
        else if(ch == 'D' || ch == 'E' || ch == 'F')
            sb.append("2");

        else if(ch == 'G' || ch == 'H' || ch == 'I')
            sb.append("3");
        else if(ch == 'J' || ch == 'K' || ch == 'L')
            sb.append("4");
        else if(ch == 'M' || ch == 'N' || ch == 'O')
            sb.append("5");
     }

     return sb.toString(); 
}

Вы можете прочитать о производительности String vs StringBuilder здесь .Pay attention to switch from concatination(+) to Builder.

0 голосов
/ 09 октября 2018

Вы return из метода после обработки первого символа.Давайте изменим ваш метод:

public static String getNumber(String phoneNumber, int i)
{

    //for (int i = 0; i < phoneNumber.length(); ++i)
    {
        char ch = phoneNumber.charAt(i);
        ch = Character.toUpperCase(ch);

        if (ch == 'A' || ch == 'B' || ch == 'C')
                return "2";         
            else if
            (ch == 'D' || ch == 'E' || ch == 'F')
                return "3";
            else if
            (ch == 'G' || ch == 'H' || ch == 'I')
                return "4";
            else if
            (ch == 'J' || ch == 'K' || ch == 'L')
                return "5";
            else if
            (ch == 'M' || ch == 'N' || ch == 'O')
                return "6";
            else if
            (ch == 'P' || ch == 'Q' || ch == 'R' || ch == 'S')
                return "7";
            else if
            (ch == 'T' || ch == 'U' || ch == 'V')
                return "8";
            else if
            (ch == 'W' || ch == 'X' || ch == 'Y' || ch == 'Z')
                return "9";

    }
    return "";
}

Обратите внимание, что у него есть параметр int, и цикл был закомментирован.Теперь давайте обработаем String:

public static function parseString(String input) {
    String output = "";
    for (int i = 0; i < input.length; i++) {
        output += getNumber(input, i);
    }
    return output;
}

Обратите внимание, что это очень просто понять.То, что делает его простым, заключается в том, что метод делает одну вещь.getNumber получает число из String по заданному индексу.parseString анализирует String в соответствии с вашим кодом.Конечно, вы можете изменить начальный String, если это является целью, используя setChar, но тогда метод getNumber должен возвращать char представление цифр.

0 голосов
/ 09 октября 2018

В качестве альтернативы вы можете использовать String.relaceAll вместо проверки каждого символа во вложенном if-else.Пример:

public static String getNumber(String phoneNumber){
    String result = phoneNumber.toUpperCase()
            .replaceAll("[A-C]", "2")
            .replaceAll("[D-F]", "3")
            .replaceAll("[G-I]", "4")
            .replaceAll("[J-L]", "5")
            .replaceAll("[M-O]", "6")
            .replaceAll("[P-S]", "7")
            .replaceAll("[T-V]", "8")
            .replaceAll("[X-Z]", "9");
    return result;
}
0 голосов
/ 09 октября 2018

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

Создайте строковую переменную перед циклом, затем просто добавьте к этой строке вместо возвратаструны.Затем, когда вы закончите итерацию телефонного номера, вы можете вернуть строку.

public static String getNumber(String phoneNumber){

String convertedNum = "";
for (int i = 0; i < phoneNumber.length(); ++i)
    char ch = phoneNumber.charAt(i);
    ch = Character.toUpperCase(ch);

    if (ch == 'A' || ch == 'B' || ch == 'C')
        convertedNum  = convertedNum + "2"; //append to the string
    else if(ch == 'D' || ch == 'E' || ch == 'F')
        convertedNum  = convertedNum + "3";
    ...

return convertedNum; //then return it at the end
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...