質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

30192閲覧

List同士の要素の比較方法

lupus_dingo

総合スコア257

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/02/07 13:11

編集2015/02/08 03:08

List同士を比較する際、

boolean bHaveA;
for(String a : aList ){
bHaveA=false;
for(String b : bList){
if(a.equals(b)){
bHaveA=true;
}
}
if(bHaveA){
action();
}
}

よりも、
for(String a : aList){
if(bList.contains(a)){
action();
}
}
の方が可読性が高いと思うのですが、
2重ループの方を使う理由ってなんでしょうか?

それから、上の2重ループのような処理は、
「bがaに含まれた場合の処理だっけ?」
それとも
「aがbに含まれた場合の処理だっけ?」
といつも混乱してしまいます。
多重ループ処理のときに処理が理解しやすくなる考え方やコーディング方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

2 つの List の共通要素 を見つけて処理をする例を 3 つ書いてみました。

  1. 単純に 2 重ループ
  2. list.contains() を使って、ループを一つ減らす。
  3. retainAll() で共通要素をもとめて, forEach() で 各要素に対して処理をする。
    (明示的な ループ処理記述は 0 個)

lang

1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4 5public class Sample { 6 public static void main(String[] args) { 7 List<String> aList = Arrays.asList("A1", "A2", "A3"); 8 List<String> bList = Arrays.asList("A4", "A3", "A2"); 9 10 for (String a : aList) { 11 if (bList.contains(a)) { 12 System.out.println(a); 13 } 14 } 15 System.out.println("----"); 16 for (String a : aList) { 17 for (String b : bList) { 18 if (a.equals(b)) { 19 System.out.println(a); 20 } 21 } 22 } 23 System.out.println("----"); 24 List<String> cList = (new ArrayList<>(aList)); 25 cList.retainAll(bList); 26 cList.forEach(s -> System.out.println(s)); 27 } 28}

実行すると、次の出力が得られます。

$ java Sample A2 A3 ---- A2 A3 ---- A2 A3

投稿2015/02/08 05:30

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2015/02/08 08:02

回答ありがとうございます。 retainAll便利ですね。 cList.forEach(s ->System.out.println(s)); この文法は初めて見ましたが、 for(String s : cList){ System.out.println(s); } のことですよね?
katoy

2015/02/08 08:38

動作は for ループと同じです。 しかし for は制御構文ですが、 forEach() はメソッドです。 参考: - lambdaについて調べてみた forEach編 http://d.hatena.ne.jp/gloryof/20140327/1395927860 > ... > forEachの実行結果とfor文の実行結果は同じです。 > forEachメソッドはリストが保持している各要素をラムダのパラメータとして渡します。 > ...
lupus_dingo

2015/02/08 15:17

このような記事の仕方があるんですね。 初めて知りました。 ありがとうございます。
guest

0

2重ループの方を使う理由:
例示されている2つのコードは、異なる動作をすると思います。
aListに、"s1", "s2", "s3", "s4"
bListに、"s1", "x2", "x3", "x4"
がそれぞれ入っていた場合、二重ループの例のコードではaction()が4回呼び出されますが、contains()を使った例のコードでは、1回しか呼び出されないように思いました。
従って、上記のようなデータが入っている時に、action()を4回呼び出したい要件があれば、2重ループのほうのコードを使う理由になります。

多重ループ処理のときに処理が理解しやすくなる考え方やコーディング方法:
TemplateMethodパターン、Visitorパターン、ChainOfResponsibilityパターンなどを理解して使いこなせるようになっておくと、ループを使った定型的な処理を書く助けになると思います。
コレクション処理関連の著名なライブラリに「CollectionUtils」があります。これも使い方を覚えておくと役に立つでしょう。

投稿2015/02/07 16:21

tokoi

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2015/02/08 03:16

すみません、表記ミスでした。。 フラグはaListの要素が変わる度にfalseに初期化されます。質問を修正しました。 その場合、2つの処理は同じことをしてるのでどちらを使ってもよいが、よりわかりやすいcontainsの方が推奨される。みたいな感じでしょうか?
tokoi

2015/02/08 04:44

特に推奨される(誰に?)わけでは無いと思いますが、同じ事をするのであれば短くて分かりやすい方が良いのではないでしょうか。
lupus_dingo

2015/02/08 07:26

回答ありがとうございます。 そうですね。containsの方を優先しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問