スライドショースライドショー

【3分Java入門】2つのListを比較しデータを抽出する方法

この記事では2つのListを比較してデータを抽出する方法をわかりやすく解説します!

「2つのList内のデータを比較したい」
「2つのList内のデータで一致するものを抽出したい」
「2つのListを比較する方法はいくつもあるの?」
「比較のループ処理をわかりやすく簡単に書きたい」

今回はそんな悩みを解決するList内のデータの比較についてです。

2つのListから一致するものを抽出する方法

2重ループを使ったシンプルな方法

ここからはListAとListBの文字列を比較して、一致する文字列でListCを作る方法を解説していきます!

初めにシンプルな2重ループを使った方法です。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Main {
    public static void main(String[] args) throws Exception {
 
        List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i"));
        List<String> listB = new ArrayList<String>(Arrays.asList("e", "n", "g", "i", "n", "e", "e", "r"));
        List<String> listC = new ArrayList<String>();
         
        System.out.println("before");        
        System.out.println("ListA = " + listA);
        System.out.println("ListB = " + listB);
        System.out.println("ListC = " + listC);
                
        for(String a : listA){
            for(String b : listB){
                if(a.equals(b)){
                    listC.add(a);
                    break;
                }
            }
        }
         
        System.out.println("after");
        System.out.println("ListA = " + listA);
        System.out.println("ListB = " + listB);
        System.out.println("ListC = " + listC);
 
    }
}
[実行結果]
before
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = []
after
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = [r, i]

これでListAとListBに共通する文字列の[r, i]がListCに追加されました!

ここでは2重ループを使ってListAの文字列ListBの文字列が同じ場合にListCに文字列を追加しています。
ListCに文字列を追加したあとは、それ以上同じ文字列を追加する必要が無いのでbreak文で処理を終了させています。

containsメソッドを使った方法

次にcontainsメソッドを使った方法を解説します。
この方法は2重ループよりも書き方がすっきりして読みやすくなります。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Main {
    public static void main(String[] args) throws Exception {
 
        List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i"));
        List<String> listB = new ArrayList<String>(Arrays.asList("e", "n", "g", "i", "n", "e", "e", "r"));
        List<String> listC = new ArrayList<String>();
         
        System.out.println("before");
        System.out.println("ListA = " + listA);
        System.out.println("ListB = " + listB);
        System.out.println("ListC = " + listC);
                
        for(String a : listA){
            if(listB.contains(a)){
            listC.add(a);
            }
        }
         
        System.out.println("after");
        System.out.println("ListA = " + listA);
        System.out.println("ListB = " + listB);
        System.out.println("ListC = " + listC);
 
    }
}
[実行結果]
before
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = []
after
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = [r, i]

このようにcontainsメソッドを使った場合も2重ループのときと同様の処理ができます。

Java8で一致するデータを抽出する場合

最後に、intersectionメソッドstreamAPIラムダ式を使った方法を解説します。

StreamAPIはJava8から追加されたデータの操作を簡単に行えるようにする機能です。
StreamAPIについては次の記事で詳しく解説しています!

次のようにStreamAPIという機能とintersectionメソッドを使うことでさらに簡潔なコードを書くことができます!

import org.apache.commons.collections4.ListUtils;
//  ~省略~

List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i"));
List<String> listB = new ArrayList<String>(Arrays.asList("e", "n", "g", "i", "n", "e", "e", "r"));
List<String> listC = new ArrayList<String>();

System.out.println("before");
System.out.println("ListA = " + listA);
System.out.println("ListB = " + listB);
System.out.println("ListC = " + listC);
		
ListUtils.intersection(listA, listB).stream().forEach(i -> listC.add(i));

System.out.println("after");
System.out.println("ListA = " + listA);
System.out.println("ListB = " + listB);
System.out.println("ListC = " + listC);
[実行結果]
before
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = []
after
ListA = [s, a, m, u, r, a, i]
ListB = [e, n, g, i, n, e, e, r]
ListC = [i, r]

ここではintersectionメソッドを使ってListAとListBに共通する要素を取り出し、それをstreamAPIとラムダ式を使ってListCに追加しています。
intersectionメソッドはApache Commonsのライブラリを使うので、事前にライブラリをダウンロードしてプロジェクトに追加する必要があります。

equalsメソッドで比較をする方法総まとめ

equalsメソッドで文字列を比較するいろいろな方法を次の記事にまとめているので、ぜひ確認してください!

まとめ

いかがでしたか?

今回は2つのListを比較してデータを抽出する方法を解説しました。
ラムダ式は理解するのが難しいと思いますが、コードを簡潔に書くことができるのでぜひ覚えてくださいね。

もしListの比較をする方法を忘れてしまったらこの記事を確認してください!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

中沢 丈

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説