这里我试图输入一个字符串,并将字符串字母与辅音字符串字母进行比较。当输入的字母和辅音匹配时,输出应该打印下一个辅音字母。
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);