2016-05-04 7 views
3

ここでは、文字列を入力し、文字列を子音文字列と比較しようとしています。入力文字と子音が一致すると、次の子音が出力されます。 jは、我々が持っているワット同様にVの後、kは後に、ここで子音をアルファベットの子音で置き換えます。

Example:: input = java 
     output = kawa 

jとvが子音ので、次の手紙です。

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){ 
     } 

    } 
} 
+1

FYI: "*アルファベット*" は、例えば、適切な言語/国で* *手紙の全配列であります英語のA-Z。したがって、「子音を次のアルファベットに置き換える」は、「子音を次の文字に置き換える」、またはより具体的には、「アルファベットの子音を次の子音に置き換える」必要があります。 – Andreas

答えて

1
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); 

出力:

カワ

2

は、他の2つの答えは、右の出力を生成しますが、彼らは非常に効率的ではないので、ここで私のテイクがあります。

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 

フォローアップcomment by @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も考慮しないように最適化されています。

+0

@ Jean-FrançoisSavard入力 'AbCdEfGhIjKlMnOpQrStUvWxYz'は' AcDfEgHjIkLmNpOqRsTvUwXyZb'を出力しますので、 'z' ok(modulusを使って説明を読んでください)を処理します。 --- 'StringBuilder'は内部的に' char [] 'を使用していますが、そのサイズが大きくなると再割り当てが必要になり、' StringBuilder'自体に余分な割り当てとコードを無駄にするので、このコードはより効率的です。また、 'StringBuilder'ではできない非子音の処理をすばやくスキップします。 – Andreas

+1

各文字に対してint型にキャストしてから、数値を変更してキャストバックを多かれ少なかれ効率的にするか? –

+0

@MistahFiggins過去の母音をスキップするために余分な作業をしなければならないので、おそらく効率が悪くなるでしょう。 – Andreas

0
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)); 
    } 
} 
0
//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); 
関連する問題