簡體   English   中英

在第一個條件返回true后,如何使循環繼續進行

[英]How can I make a loop keep going after the first condition returns true

我正在嘗試編寫一種方法,該方法將使用字符串,將任何字母轉換為int,並將所有轉換后的int返回main,以替換字母。 我有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 "";



}
}

您想將字符串結果附加到一個字符串上,該字符串將在迭代給定電話號碼時繼續增長。

在循環之前創建一個String變量,然后簡單地追加到該字符串而不是返回字符串。 然后,一旦完成電話號碼的迭代,就可以返回字符串。

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
}

處理完第一個字符后,您將從方法中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 當然,如果setChar ,可以使用setChar修改初始String ,但是getNumber方法應該返回數字的char表示形式。

或者,您可以使用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;
}

我建議您將StringBuilderString相比,因為與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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM