换信,我在做什么错?

时间:2018-09-22 00:37:14

标签: java

因此,我正在尝试以下挑战: 使用Java语言,让函件LetterChanges(str)接受要传递的str参数,并使用以下算法对其进行修改。用字母后面的字母替换字符串中的每个字母(即c变成d,z变成a)。然后在此新字符串(a,e,i,o,u)中将每个元音大写,最后返回此修改后的字符串。

这是我的代码

class LetterChange {  
  public static String LetterChanges(String str) {
    String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";
    char currentChar,letter;
    int i = 0;
    while (i < str.length())
    {
      currentChar = str.charAt(i);
      for(int x = 0; x < alphabet.length(); x++)
      {
        letter = alphabet.charAt(x);
        if (currentChar == letter){
          str  = str.replace(currentChar,alphabet.charAt(x+1));
          i++;
        }
      }
    }

当我运行它时,它将返回字符串+1字母中的最后一个字符。例如,如果我要运行“ bcd”,它将返回“ EEE”。我不明白为什么它用最后一个字符的循环结果替换所有字符。

3 个答案:

答案 0 :(得分:0)

此解决方案有帮助吗?

public static String letterChanges(String str) {
    String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";

    StringBuilder stringBuilder = new StringBuilder();

    for (char letter : str.toCharArray()) {
        if (alphabet.contains(Character.toString(letter))) {
            int index = alphabet.indexOf(letter) + 1;

            if (index >= 26) {
                index = 0;
            }

            stringBuilder.append(alphabet.charAt(index));
        }
    }

    return stringBuilder.toString();
}

以前的解决方案很难遵循,因此很难解释为什么没有调试就无法解决问题的原因。使用for-each循环遍历str参数并使用Java提供的方法(如.indexOf和.charAt)查找匹配项会更容易。

此外,Java使用小写驼峰方法命名,用letterChanges代替LetterChanges:)

如果您有任何疑问,请告诉我。

答案 1 :(得分:0)

第一次进入循环时

"bcd"--> "ccd"

现在,str.replace将在下一回合中将其转换为“ ddd”,然后变为“ EEE”。 也就是说,替换将替换每回合中的所有匹配项。

的确,将来在IDE中对其进行调试将为您提供帮助! 另外,如果您的字符串中有一个小写的元音怎么办?

 public class Alphabet {

          public static String LetterChanges(String str) {
            String alphabet = "AbcdEfghIjklmnOpqrstUvwxyz";


            char[] string = str.toLowerCase().toCharArray();
            for (int i=0; i < string.length; i++) {
                char d = alphabet.charAt(((alphabet.toLowerCase().indexOf(string[i]))+1) % 26);

                string[i]=d;
            }

            return new String(string);
          }    
    public static void main(String[] args) {
        System.out.println(Alphabet.LetterChanges("aabb"));


    }       
}

alphabet.charAt(

(((alphabet.toLowerCase()。indexOf(string [i]))

+1)%26)

1)在输入和字符串映射上使用toLowerCase消除大小写问题

2)在字符串映射“字母”中的索引+1处找到字符,并使用将z取为a的模数将其视为圆形缓冲区。
索引25(z)+ 1 == 26-> 0(A),因为26是0 mod 26,而索引0(A)+ 1 = 1-> 1 mod26。只需要将z包装到A同时不更改其他25个索引,并且比使用“ if”语句进行分支更有效。

答案 2 :(得分:0)

之所以得到该结果,是因为每次替换都需要重新设置输入字符串。我建议您:

  • 最好尝试使用两个不同的变量:让输入变量保持不变,并处理输出变量。
  • 由于字符串是不可修改的-正如您已经知道的-最好将它们声明为char数组。
  • 为优化起见,请将您的算法基于一个单循环,该循环将遍历输入字符串的字符。对于每个字符,请确定该字符是否为字母,以及是否应替换为哪个字符。