用字母表中的下一个辅音替换字符串中的辅音



这里我试图输入一个字符串,并将字符串字母与辅音字符串字母进行比较。当输入的字母和辅音匹配时,输出应该打印下一个辅音字母。

Example:: input = java
         output = kawa  

这里j和v是辅音,所以j之后的下一个字母是k,同样在v之后我们有w。

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter any string = ");
String inputString = bf.readLine().toLowerCase();
for(int i=0; i < inputString.length(); i++){
    inputChar = inputString.charAt(i);
    String consonants = "BCDFGHJKLMNPQRSTVWXYZ".toLowerCase();
    for(int j = 0; j < consonants.length(); j++){
        stringChar = consonants.charAt(j);
        if(inputChar == stringChar){
        }  
    }
}

其他两个答案产生了正确的输出,但效率不是很高,所以我的看法如下

consonants应该是一个常量,并且应该简单地以小写字母给出。作为一个常量,它应该以大写字母(CONSONANTS)命名。

要进行逐字符替换,最有效的方法是使用toCharArray()获取原始字符串的char[],修改数组,并使用new String(char[])创建新字符串。

CONSONANTS常数中找到字母索引的最简单方法是使用indexOf()方法。

若要在索引中添加1时防止溢出,请使用模数运算符(%)。

private static final String CONSONANTS = "bcdfghjklmnpqrstvwxyz";
private static String shiftConsonants(String input) {
    char[] chars = input.toLowerCase().toCharArray();
    for (int i = 0; i < chars.length; i++) {
        int idx = CONSONANTS.indexOf(chars[i]);
        if (idx != -1)
            chars[i] = CONSONANTS.charAt((idx + 1) % CONSONANTS.length());
    }
    return new String(chars);
}

测试:

System.out.println(shiftConsonants("Java")); // prints: kawa

这是一个保留原始情况的替代解决方案。

private static final String CONSONANTS = "bcdfghjklmnpqrstvwxyz";
private static String shiftConsonants(String input) {
    char[] chars = input.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char ch = chars[i];
        char lower = Character.toLowerCase(ch);
        int idx = CONSONANTS.indexOf(lower);
        if (idx != -1) {
            char next = CONSONANTS.charAt((idx + 1) % CONSONANTS.length());
            chars[i] = (ch == lower ? next : Character.toUpperCase(next));
        }
    }
    return new String(chars);
}

测试:

System.out.println(shiftConsonants("Java")); // prints: Kawa

跟进@MistahFiggins的评论:

将每个字符强制转换为int,然后修改数字并强制转换回,效率会更高还是更低?

我的猜测是错误的。对于小写版本(上面的第一个),数字增量比快36%。

private static String shiftConsonants(String input) {
    char[] chars = input.toLowerCase().toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char ch = chars[i];
        if (ch == 'z')
            chars[i] = 'b';
        else if (ch >= 'b' && ch <= 'y' && ch != 'e' && ch != 'i' && ch != 'o' && ch != 'u') {
            ch = (char)(ch + 1);
            if (ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
                ch++;
            chars[i] = ch;
        }
    }
    return new String(chars);
}

正如您所看到的,它被优化为甚至不考虑a

String consonants = "BCDFGHJKLMNPQRSTVWXYZ".toLowerCase();
String inputString = "java";
String retStr = "";
inputString = inputString.toLowerCase();
for(int i=0; i < inputString.length(); i++)
{
     char inputChar = inputString.charAt(i);
     int indexOfCons = consonants.indexOf(inputChar);
     if (indexOfCons != -1)
     {
           indexOfCons++;
           // if the letter is Z, then go around to B
           if (indexOfCons == consonants.length())
           {
                indexOfCons = 0;
           }
           retStr += consonants.charAt(indexOfCons);
     }
     else
     {
           retStr += inputChar;
     }
}
System.out.println(retStr);

输出:

kawa

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TestIt {
    public static void main(String args[]) throws IOException
    {
        List<Character> consonantList = new ArrayList<Character>();
        consonantList.addAll(Arrays.asList('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        char[] userInput = bufferedReader.readLine().toLowerCase().toCharArray();
        for(int i=0;i<userInput.length;i++)
        {
            if(consonantList.contains(userInput[i]))
            {
                userInput[i]=consonantList.get((consonantList.indexOf(userInput[i])+1)%21);
            }
        }
        System.out.println(String.valueOf(userInput));
    }
}
 //declare out side of the loop
 String consonants = "BCDFGHJKLMNPQRSTVWXYZ".toLowerCase();
 //initialize the result
 String op = "";
 for(int i=0; i < inputString.length(); i++){
     inputChar = inputString.charAt(i);
     //find the index of char 
     int index = consonants.indexOf(inputChar);
     //if char 'z' then point to 'b' or to the next char
     op += index==-1 ? inputChar : consonants.charAt(index == consonants.length()-1  ? 0 : index+1);
 }
System.out.println(op);

最新更新