🛁

与えられた文字列から母音を取り除く

2022/03/01に公開

タイトルの通り、文字列から母音を取り除く方法について調べたのでまとめておく。
参考になるお手本2つと、参考にならないであろう、私が試した方法を両方載せてあります!

狙い

以下の入力値を入れた時に、母音を抜いた文字列を出力したい!

入力値と出力値

input:  "Hello World!"
output: "Hll Wrld!""

お手本1: 母音を格納した配列と、.contains().replace()を利用

GeeksforGeeksでシンプルなやり方を見つけたのでそのまま拝借。
後述のお手本2と比べると、私のような初心者でも思いつくはず!という方法。

  1. 配列vowelsに取り除く母音を格納
  2. vowelsalという連想配列内の要素として格納
  3. 文字列内部の一文字一文字をループさせて、vowels内の要素と合致する文字は.replace()を使って""と入れ替える(=文字列からは事実上削除)
// Java program to remove vowels from a String

import java.util.Arrays;
import java.util.List;

class Test
{
	static String remVowel(String str)
	{
		Character vowels[] = {'a', 'e', 'i', 'o', 'u','A','E','I','O','U'};
		
		List<Character> al = Arrays.asList(vowels);
		
		StringBuffer sb = new StringBuffer(str);
		
		for (int i = 0; i < sb.length(); i++) {
			
			if(al.contains(sb.charAt(i))){
				sb.replace(i, i+1, "") ;
				i--;
			}
		}
				
		return sb.toString();
	}
	// Driver method to test the above function
	public static void main(String[] args)
	{
		String str = "GeeeksforGeeks - A Computer Science Portal for Geeks";
		
		System.out.println(remVowel(str));
	}
}

https://www.geeksforgeeks.org/program-remove-vowels-string/

Methods

調べたので一応載せておく。公式ドキュメント見れば載っていることですが、個人的なメモ。

contains()について

boolean contains(Object o)

  • oを含んでいいたらtrueを返す。
  • Collectionを継承しているクラス・インターフェースで使用可能(List, Map, Setが代表例)

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#contains-java.lang.Object-

replace()について

public String replace(CharSequence target,CharSequence replacement)

  • target -> replacement に置き換える(そのまんまですね!)
    • "abc".replace("b", "de")で、"adec"と出力。

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

お手本2: Regular Expressions (正規表現)を利用したやり方

そもそも正規表現にあまり親しめてないので、これは調べなかったら分からなかった方法。

String string = "A really COOL string";
string = string.replaceAll("[AaEeIiOoUu]", "");
System.out.println(string);

https://stackoverflow.com/questions/19329307/writing-a-method-to-remove-vowels-in-a-java-string

なんというか、シュッとしてはる。replaceAll()についてにあるように、第一パラメータに含まれた文字は、第2パラメータの" "に一気に入れ替えられる。

正規表現(Regular Expressions a.k.a. Regex)

  • JavaのAPIのうちのひとつ(java.util.regex)で、文字列のパターンを定義する。
  • 文字のパターンの定義方法はPattern classで定義されている。
      • [a-zA-Z]: 大文字と小文字の全アルファベット

https://www.geeksforgeeks.org/regular-expressions-in-java/

Methods

replaceAll()について

public String replaceAll(String regex, String replacement)

  • 1つ目のargumentが[正規表現](#正規表現(Regular Expressions a.k.a. Regex))、2つ目は対象の文字列。
  • 注意点は、\$replacementに含まれている時は、結果が異なるかもしれないということ。その場合は、Matcher.quoteReplacement(java.lang.String)を使いましょう。

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replaceAll-java.lang.String-java.lang.String-

個人的なトライ

私がこの処理が出てくる問題が出て書いたコードは以下のような非常に泥臭い、かつverboseなものでした。

  1. 文字列の取得
  2. 文字列を一文字ずつ評価していく。その文字が母音かどうか、一つ一つ確かめていく。
    1. もしその文字が母音でなければ、答えの文字列に追加。
    2. 次の文字へ
  3. 答えの文字列を出力

一応は機能するけど、美しくはないし、多分早くもない。記録として残しておきますが。

public static void main(String[] args) {  

	String line = "Hello World!"; // input!
	
	String result = "";  
	for(int i = 0; i < line.length(); i++) {  
		String letter = line.substring(i, i + 1);  
		if(letter.equals("a") || letter.equals("A") ||  
			letter.equals("e") || letter.equals("E") ||  
			letter.equals("i") || letter.equals("I") ||  
			letter.equals("o") || letter.equals("O") ||  
			letter.equals("u") || letter.equals("U") ) {  
		} else {  
			result += letter;  
		}  
	}  
	System.out.println(result);
}

否定条件に関しての覚書き

なんだか以下の条件の部分がおかしい。というか、改善できる気がする。

if(letter.equals("a") || letter.equals("A") ||  
	letter.equals("e") || letter.equals("E") ||  
	letter.equals("i") || letter.equals("I") ||  
	letter.equals("o") || letter.equals("O") ||  
	letter.equals("u") || letter.equals("U") ) {  
} else {  
	result += letter;  
} 

言葉にすると、こんな感じかな。

if(肯定条件){
	// 特にやりたいことなどない
}else {
	// やりたいことはこちら!
}

でも、理想のケースは

if (否定条件){
	// やりたい処理
}

一応、理想のようにやろうとすると...

if(!  
   (letter.equals("a") || letter.equals("A") ||  
   letter.equals("e") || letter.equals("E") ||  
   letter.equals("i") || letter.equals("I") ||  
   letter.equals("o") || letter.equals("O") ||  
   letter.equals("u") || letter.equals("U") )  
) {  
   result += letter;  
}

くらいしか思い浮かばない...

Discussion