IT転職・プログラミングスクール

removeメソッドの落とし穴【Java Silver例題】

Java Silver 例題

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。

今回は、removeメソッドについてです。

 

removeメソッドはリストに格納されている指定の要素を削除するメソッドです。

Java Silverでは50%の確率で出題される問題です。

 

問題:removeメソッドについて

早速ですが、次の3問を解いてみてください。

問1

A.   [ペ]と表示される
B.   [ペ,ギ]と表示される
C.   [ペ,ギ,ン]と表示される
D.   [ぺ,ン,ギ]と表示される
E.    コンパイルエラー

 

問2

A.  「ペンギン」と表示される
B.  「ペンン」と表示される
C.  「ペンギ」と表示される
D.  「ぺン」と表示される
E.    コンパイルエラー

 

問3

A.  「ペンン様」と表示される
B.  「ペン様」と表示される
C.  「ペン」と表示される
D.     コンパイルエラー

 

いかがでしょうか?

 

 

答えは

問1 C
問2 D

問3 D      です。

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

 

removeメソッドのポイントとコツ

removeメソッドの基本的な使い方は次の2通りがあります。

●インデックス位置の要素を削除する
list.remove(2);

●文字もしくは文字列が一致する要素を削除する
list.remove("A");

※一致する要素が複数ある場合はインデックスが小さい方を削除

 

このように使い方はいたってシンプルですが、次のポイントに気をつけなければなりません。

 

ポイント

要素を削除した場合、それ以降の要素が1つずつ前に詰める

removeメソッドのイメージ図

removeメソッドは消した要素を後ろの要素が詰めることを理解しなければいけません。

これのどこが重要なのか疑問に思う方もいるかもしれません。

たしかに、基本的には問題ありませんが次のような使い方をしたときに思っていた結果と違う場合があります。

1  list.add("あ");
2  list.add("い");
3  list.add("う");
4   for (String s : list) {
5   if ("い".equals(s)) {
6   list.remove(s)
7   } else {
8   System.out.print(s);
9   }
10 }

出力結果

 

このプログラムでは4行目の拡張for文で要素を1つずつsに代入しいます。

代入した要素はif文で"い"と一致する場合にその要素は削除され、一致しない場合はその要素を出力します。

単純に考えると出力結果は「あう」と思ってしまいますが、実は「あ」だけが出力されます。

この現象は正しく上述したポイントが関係しています。

処理を図示すると

removeメソッド

このようにremoveメソッドで"い"が消え、後ろの"う"が詰めてしまうので、拡張for文は2周で終わってしまいます。

したがって、出力結果は「あ」だけとなります。

 

解説

removeメソッドの基本的な使い方と、今回のポイントを理解していれば今回の問題は解くことができます。

 

問1

A.   [ペ]と表示される
B.   [ペ,ギ]と表示される
C.   [ペ,ギ,ン]と表示される
D.   [ぺ,ン,ギ]と表示される
E.    コンパイルエラー

 

この問題では、listに格納された[ぺ,ン,ギ,ン]に対し、10行目で"ン"の要素を削除しています。

"ン"は2つありますが、一致するものが複数ある場合は先に一致する要素だけを削除するので、[ぺ,ギ,ン]が出力されます。

したがって、答えはCです。

 

問2

A.  「ペンギン」と表示される
B.  「ペンン」と表示される
C.  「ペンギ」と表示される
D.  「ぺン」と表示される
E.    コンパイルエラー

 

この問題は[ぺ,ン,ギ,ン]を拡張for文で1要素ずつ代入し、if文で"ギ"なら削除し、それ以外は出力する処理です。

拡張for文の1周目と2周目で「ペ」と「ン」が出力されます。

3周目で「ギ」は削除されますがこのとき後ろの「ン」が空いた1つ前の要素に詰めています。

したがって、4周目では4番目の要素が存在しないことになっているので拡張for文は3周で終了し、「ペン」だけを出力します。

よって、答えはDです、

 

問3

A.  「ペンン様」と表示される
B.  「ペン様」と表示される
C.  「ペン」と表示される
D.     コンパイルエラー

 

この問題は問2と同じように、拡張for文の1,2周目で「ペン」と出力し、3周目で「ギ」が削除されます。

4周目では「ン」は前に詰めているので、その次の「様」が出力されると思いたいのですが、実はこの問題はひっかけです。

拡張for文のようなループの途中でremoveメソッドにより要素を削除した後次にループを実行しようとするとコンパイルエラーになってしまいます。

問2と違い、このプログラムはremoveメソッドで「ギ」を削除した後に次の要素がまだあるため、コンパイルエラーとなります。

したがって、答えはDです。

 

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

-IT転職・プログラミングスクール
-,

Copyright© 人生2段飛ばし , 2020 All Rights Reserved Powered by AFFINGER5.