簡體   English   中英

Java方法未達到預期的效果。 試圖了解為什么

[英]Java method not doing what expected. Trying to understand why

嘗試編寫一個將接收字符串的Java方法,循環遍歷它,並在其中找到一個元音(A,E,I,O,U,Y)的地方用元音加“ OB”替換它。

我已經寫了下面的內容,但是它沒有按我期望的那樣工作,並且似乎無法將字符串中的當前字符與列表中的元音匹配。 (該程序可以編譯並運行,因此在開始時不導入必要的位就不是問題。輸入字符串將始終為大寫且僅包含字母。)我正在努力弄清哪里出了問題。

有人可以幫忙嗎?

public static String obifyText(String text) {

    String[] myList = new String[] {"A","E","I","O","U","Y"};
    StringBuilder tempText = new StringBuilder(text);
    String obify = "OB";
    for (int i = 0; i < text.length() -1 ; i ++ ) {
        if ( Arrays.asList(myList).contains(tempText.charAt(i)) ) {
            System.out.println(tempText.charAt(i)+" found.");
            tempText = tempText.insert((i+1),obify);
        }
    }

    text = tempText.toString();
    return text;
}

不要玩索引。

當您處理更改字符串時,使用索引進行管理可能很困難。

按如下所示循環char本身:

public static void main(String[] args){
    String[] myList = new String[] {"A","E","I","O","U","Y"};
    String text = "AEE";
    StringBuilder tempText = new StringBuilder("");
    String obify = "OB";
    for (char c : text.toCharArray()){
        tempText = tempText.append(c);
        if ( Arrays.asList(myList).contains(c+"") ) {
            System.out.println(c+" found.");
            tempText = tempText.append(obify);
        }
    }

    text = tempText.toString();
    System.out.println(text);
}

輸出:

A found.
E found.
E found.
AOBEOBEOB

您比較Arrays.asList(myList).contains(tempText.charAt(i))兩種不同類型, Arrays.asList(myList)List<String>tempText.charAtchar 因此,包含檢查將永遠不會導致結果為true。

一種可能的解決方法,將myList更改為Character[]

Character[] myList = new Character[] {'A','E','I','O','U','Y'};

實際插入還有另一個問題,請參見Pankaj Singhal答案以尋求解決方案。

charAt返回一個char ,但是myList存儲String元素。 String數組不能contain char值。 您的if語句永遠不會運行。

您可以將char值轉換為字符串:

Arrays.asList(myList).contains(Character.toString(tempText.charAt(i))) 

您的代碼只有一個問題。

當代碼在元音之后插入OB ,會有一個副作用:創建了一個新的元音O。 然后,您的代碼嘗試在新的O之后插入OB 這是不希望的,對吧?

要使其不執行此操作,可以從字符串的末尾循環到開頭:

for (int i = text.length() - 1; i >= 0 ; i--) {

如果這不是使用StringBuilder或for循環練習的家庭作業問題,那么以下是使用正則表達式的一個線性解決方案:

return text.replaceAll("([AEIOUY])", "$1OB");

暫無
暫無

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

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