繁体   English   中英

Java 程序中偶数索引的问题

[英]Problem with even indexes in Java program

该方法采用 2 个参数 (String,char) 并返回字符串,如果索引为偶数,则用'+'替换字符,如果索引为奇数,则返回'#'

我使用的字符串是"Mary Bella Abracadabra" ,预期的 output 是"M+ry Bell+ +br#c#d#br+" 相反,我得到"M#ry Bell# #br#c#d#br#"

我在我的代码中找不到错误。 似乎找到 char ch 的所有索引都是奇数。

public String emphasize (String phrase, char ch){
    String phraseEmph = "";
    char c1 = '#';
    char c2 = '+';
    for (int i=0; i < phrase.length(); i++){
         char c = phrase.charAt(i);
         char cc = Character.toLowerCase(c);
         if ((cc == ch) && ((i % 2) == 0)){
            phraseEmph = phrase.replace(c,c2);
            phrase = phraseEmph;   
            }
         else if ((cc == ch) && ((i % 2)!= 0)){
            phraseEmph = phrase.replace(c,c1);
            phrase = phraseEmph;   
            }  
         phrase = phrase; 
    }
    return phrase;
}

public void testEmphasize(){
    String phrase = "Mary Bella Abracadabra";
    char ch = 'a';
    String Emphasized = emphasize(phrase,ch);
    System.out.println("Emphasized : " + Emphasized);
}

当您调用replace时,它不仅会替换当前'a' ,还会替换所有这些。 您需要找到一种不同的方法来替换字符,以便一次只更改一个。

(我故意避免提出修复建议。如果你自己想出它会更有教育意义。)

注意 数组在 java 中以 0 开头。 String 是不可变的,不提供很多可变方法。 为了方便和 memory 效率,最好使用如下所示的 StringBuilder。

    public static String emphasize(String phrase, char ch) {
    StringBuilder phraseEmph = new StringBuilder(phrase);
    char c1 = '#';
    char c2 = '+';
    for (int i = 0; i < phrase.length(); i++) {

        char c = phrase.charAt(i);
        char cc = Character.toLowerCase(c);
        if ((cc == ch) && ((i % 2) == 0)) {
            phraseEmph.setCharAt(i, c2);
        } else if ((cc == ch) && ((i % 2) != 0)) {
            phraseEmph.setCharAt(i, c1);
        }
    }
    return phraseEmph.toString();
}

这里有一些建议。

  • 使用StringBuilder进行字符替换。 初始化为原始字符串。 然后,您可以使用setCharAt进行更改。
  • 将 indexOf 与toLowerCase结合使用。 那么你不需要验证你是否找到了这个字符,只需使用返回的索引,如果 -1 则返回最终的字符串。
  • 然后像你正在做的那样检查偶数或索引,但分配给一个持有 char 变量。
  • 然后用它来替换字符。 像这个伪代码
    char repl;
    if (even) {
       repl = '#';
    } else {
       repl = '+';
    }
    make replacement
  • 不要检查偶数或奇数。 只需检查一个条件,否则它必须是另一个条件(无需再次检查)。

除了我的建议,这里还有另一种方法。

主要区别在于它使用偶数/奇数结果来索引数组以替换字符。

public static String emphasize(String phrase, char ch) {
    StringBuilder sb = new StringBuilder(phrase);
    char[] chars = { '#', '+' };
    int idx = -1;
    while ((idx = phrase.toLowerCase().indexOf(ch, idx + 1)) >= 0) {
        sb.setCharAt(idx, chars[idx % 2]);
        phrase = sb.toString();
    }
    return phrase;
}    
  1. 使用StringBuilder而不是String连接到循环内的字符串,因为它更快并且消耗更少的 memory。
  2. 在比较之前将两个字符转换为相同大小写(例如小写)。 这样,您可以在任何情况下将字符传递给 function。
  3. 对于这种情况,您不应使用String#replace ,因为它会替换被替换字符串中所有出现的替换字符/字符串。

演示:

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(emphasize("Mary Bella Abracadabra", 'a'));
        System.out.println(emphasize("Mary Bella Abracadabra", 'A'));
    }

    public static String emphasize(String phrase, char ch) {
        char c1 = '#';
        char c2 = '+';
        StringBuilder sb = new StringBuilder();

        // Convert the char parameter to lower case
        char chLower = Character.toLowerCase(ch);

        for (int i = 0; i < phrase.length(); i++) {
            char c = phrase.charAt(i);
            if (Character.toLowerCase(c) == chLower) {
                if (i % 2 == 0) {
                    sb.append(c1);
                } else {
                    sb.append(c2);
                }
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

Output:

M+ry Bell+ +br#c#d#br+
M+ry Bell+ +br#c#d#br+

你的代码效率很低,我的建议是:

class emphasize {
    private String phrase;
    private char ch;
    public emphasize(String phrase, char ch) {
        this.phrase = phrase;
        this.ch = ch;
    }
    public String execute() {
        char chars[] = phrase.toCharArray();
        for (int i = 0 ; i < chars.length ; i++) {
            /* As char is primitive type I can use == */
            if (chars[i]==Character.toLowerCase(ch) || chars[i]==Character.toUpperCase(ch)) chars[i] = i%2==0 ? '+' : '#';
        }
        return String.valueOf(chars);
    }
}
public class Main {
    public static void main(String[] args) {
        String phrase = "Mary Bella Abracadabra";
        char ch = 'a';
        emphasize obj = new emphasize(phrase, ch);
        System.out.println(obj.execute());
    }
}

Output:

在此处输入图像描述

完整测试的简化代码:

public class Main {
    public static void main(String[] args) {
        String phrase = "Maryaa Bella Abracadabra";
        char ch = 'a';
        System.out.println("Original   : " + phrase);
        String Emphasized = emphasize(phrase,ch);
        System.out.println("Emphasized : " + Emphasized);
    }
    
    public static String emphasize (String phrase, char ch){
        StringBuilder temp = new StringBuilder(phrase); 
        char c1 = '#';
        char c2 = '+';
        for (int i = 0; i < phrase.length(); i++){
             char c  = phrase.charAt(i);
             char cc = Character.toLowerCase(c);
             if(cc == ch) {
                 if(i%2 == 0){
                     temp.setCharAt(i, c1);
                 } else {
                     temp.setCharAt(i, c2);
                 }
             }
        }
        return temp.toString();
    }
        
}

Output:

Original   : Maryaa Bella Abracadabra                                                                                                                          
Emphasized : M+ry#+ Bell+ +br#c#d#br+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM