この記事では2つのListを比較してデータを抽出する方法をわかりやすく解説します!
「2つのList内のデータを比較したい」
「2つのList内のデータで一致するものを抽出したい」
「2つのListを比較する方法はいくつもあるの?」
「比較のループ処理をわかりやすく簡単に書きたい」
今回はそんな悩みを解決するList内のデータの比較についてです。
なお、Javaの記事については、こちらにまとめています。
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の比較をする方法を忘れてしまったらこの記事を確認してください!