Java方法未达到预期的效果。试图了解原因

时间:2018-08-18 11:31:40

标签: java

尝试编写一个Java方法,该方法将接收字符串,在字符串中循环遍历,并在找到元音的位置(A,E,I,O,U,Y)将其替换为元音加“ OB”。

我已经写了下面的内容,但是它不能按我期望的那样工作,并且似乎无法将字符串中的当前字符与列表中的元音匹配。 (该程序可以编译并运行,因此在开始时不导入必要的位就不是问题。输入字符串将始终为大写且仅包含字母。)我正在努力弄清哪里出了问题。 / p>

有人可以帮忙吗?

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

3 个答案:

答案 0 :(得分:4)

不使用索引。

在处理更改字符串时,使用索引进行管理可能很困难。

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

答案 1 :(得分:1)

您比较Arrays.asList(myList).contains(tempText.charAt(i))中的两种不同类型,Arrays.asList(myList)List<String>,而tempText.charAtchar。因此,包含检查将永远不会导致结果为真。

一个可能的解决方法,将myList更改为Character[]

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

实际插入还有另一个问题,有关解决方案,请参见Pankaj Singhal的答案。

答案 2 :(得分:1)

charAt返回一个char,但是myList存储String个元素。 String数组不能包含contain的{​​{1}}值。您的if语句永远不会运行。

您可以将char值转换为字符串:

char

您的代码只有一个问题。

当代码在元音之后插入Arrays.asList(myList).contains(Character.toString(tempText.charAt(i))) 时,会有一个副作用:创建了一个新的元音O。然后,您的代码尝试在新的OB之后插入OB。这是不希望的,对吧?

要使其不执行此操作,可以从字符串的末尾循环到开头:

O

如果这不是使用for (int i = text.length() - 1; i >= 0 ; i--) { 或for循环练习的家庭作业问题,那么以下是使用正则表达式的一个线性解决方案:

StringBuilder