Java方法未执行预期的操作。试图理解为什么

Java方法未执行预期的操作。试图理解为什么,java,Java,尝试编写一个java方法,该方法将获取一个字符串,在其中循环找到一个元音(a、E、I、O、U、Y),并将其替换为元音加上“OB” 我已经写了下面的内容,但它没有像我预期的那样工作,而且似乎没有将字符串中的当前字符与列表中的元音匹配。(该程序编译并运行,因此在开始时不导入必要的位不会造成问题。输入字符串将始终为大写且仅包含字母。)我正在努力找出哪里出了问题 有人能帮忙吗 public static String obifyText(String text) { String[] myLi

尝试编写一个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;
}
公共静态字符串obifyText(字符串文本){
字符串[]myList=新字符串[]{“A”、“E”、“I”、“O”、“U”、“Y”};
StringBuilder TENTEXT=新的StringBuilder(文本);
字符串obify=“OB”;
对于(int i=0;i
您可以比较
数组中的两种不同类型。asList(myList)。contains(testext.charAt(i))
数组。asList(myList)
列表
,而
testext.charAt
字符。因此,contains检查永远不会得到true

一个可能的修复方法是将myList更改为
字符[]

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

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

您可以比较
数组中的两种不同类型。asList(myList).contains(attextext.charAt(i))
数组。asList(myList)
列表,而
attextextext.charAt
字符。因此,contains检查永远不会得到true

一个可能的修复方法是将myList更改为
字符[]

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

实际插入还有另一个问题,请参阅Pankaj Singhal答案以获得解决方案。

不要使用索引

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

循环
char
s本身,如下所示:

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

不要玩索引

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

循环
char
s本身,如下所示:

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

charAt
返回
char
,但
myList
存储
String
元素。
String
s数组决不能
包含
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循环练习的家庭作业问题,那么这里有一个使用regex的单行程序解决方案:

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

charAt
返回
char
,但
myList
存储
String
元素。
String
s数组决不能
包含
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循环练习的家庭作业问题,那么这里有一个使用regex的单行程序解决方案:

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

您能给出一些示例输入,以及方法在给定这些输入时返回的值和期望值吗?您能给出一些示例输入,以及方法在给定这些输入时返回的值和期望值吗?这不起作用。问题在于如果两个元音同时出现在索引中。运行您的代码并检查。这不起作用。问题在于如果两个元音同时出现在索引中。运行代码并检查。