🛁
与えられた文字列から母音を取り除く
タイトルの通り、文字列から母音を取り除く方法について調べたのでまとめておく。
参考になるお手本2つと、参考にならないであろう、私が試した方法を両方載せてあります!
狙い
以下の入力値を入れた時に、母音を抜いた文字列を出力したい!
入力値と出力値
input: "Hello World!"
output: "Hll Wrld!""
.contains()
&.replace()
を利用
お手本1: 母音を格納した配列と、GeeksforGeeksでシンプルなやり方を見つけたのでそのまま拝借。
後述のお手本2と比べると、私のような初心者でも思いつくはず!という方法。
- 配列
vowels
に取り除く母音を格納 -
vowels
をal
という連想配列内の要素として格納 - 文字列内部の一文字一文字をループさせて、
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));
}
}
Methods
調べたので一応載せておく。公式ドキュメント見れば載っていることですが、個人的なメモ。
contains()について
boolean contains(Object o)
-
o
を含んでいいたらtrue
を返す。 - Collectionを継承しているクラス・インターフェースで使用可能(
List
,Map
,Set
が代表例)
replace()について
public String replace(CharSequence target,CharSequence replacement)
- target -> replacement に置き換える(そのまんまですね!)
-
"abc".replace("b", "de")
で、"adec"
と出力。
-
お手本2: Regular Expressions (正規表現)を利用したやり方
そもそも正規表現にあまり親しめてないので、これは調べなかったら分からなかった方法。
String string = "A really COOL string";
string = string.replaceAll("[AaEeIiOoUu]", "");
System.out.println(string);
なんというか、シュッとしてはる。replaceAll()についてにあるように、第一パラメータに含まれた文字は、第2パラメータの" "
に一気に入れ替えられる。
正規表現(Regular Expressions a.k.a. Regex)
- JavaのAPIのうちのひとつ(
java.util.regex
)で、文字列のパターンを定義する。 - 文字のパターンの定義方法は
Pattern
classで定義されている。- 例
-
[a-zA-Z]
: 大文字と小文字の全アルファベット
-
- 例
Methods
replaceAll()について
public String replaceAll(String regex, String replacement)
- 1つ目のargumentが[正規表現](#正規表現(Regular Expressions a.k.a. Regex))、2つ目は対象の文字列。
- 注意点は、
\
や$
がreplacement
に含まれている時は、結果が異なるかもしれないということ。その場合は、Matcher.quoteReplacement(java.lang.String)
を使いましょう。
個人的なトライ
私がこの処理が出てくる問題が出て書いたコードは以下のような非常に泥臭い、かつverboseなものでした。
- 文字列の取得
- 文字列を一文字ずつ評価していく。その文字が母音かどうか、一つ一つ確かめていく。
- もしその文字が母音でなければ、答えの文字列に追加。
- 次の文字へ
- 答えの文字列を出力
一応は機能するけど、美しくはないし、多分早くもない。記録として残しておきますが。
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