どうも、ちょげ(@chogetarou)です。
2つのリスト(List)の差分を取得する方法を紹介します。
方法

2つのリスト(List)の差分を取得する方法は、4つあります。
「-」演算子
1つ目は、「-」演算子を使う方法です。
具体的な方法としては、「-」演算子の両辺に対象の2つのリストを指定します。
//list1, list2=対象の2つのリスト
val result = list1 - list2
上記の「-」演算子は、両辺のリスト(List)の差分をリストとして取得します。
使用例
fun main() {
val nums1 = listOf(1, 2, 3, 4, 5)
val nums2 = listOf(2, 4, 5)
val result = nums1 - nums2
println(result)
}
出力:
[1, 3]
minus()
2つ目は、minus()を使う方法です。
まず、片方のリストからminus()を呼び出します。
そして、minus()の引数にもう片方のリストを指定します。
//list1, list2=対象の2つのリスト
val result = list1.minus(list2)
上記のminus()は、対象の2つのリスト(List)の差分をリストとして取得します。
使用例
fun main() {
val nums1 = listOf(1, 2, 3, 4, 5)
val nums2 = listOf(2, 4, 5)
val result = nums1.minus(nums2)
println(result)
}
出力:
[1, 3]
filter()
3つ目は、filter()を使う方法です。
まず、2つのリストを結合します。
結合したリストからfilter()を呼び出します。
filter()のクロージャーで、結合したリストから呼び出したcount()の結果が「1」となる場合にtrueとなる条件式を返します。
そして、count()のクロージャーで、引数とリストの要素が等しい時にtrueとなる条件式を返します。
//list1, list2=対象の2つのリスト
val newList = list1 + list2
val result = newList.filter { item ->
newList.count { it == item } == 1
}
上記のfilter()は、対象の2つのリスト(List)の差分を取得します。
使用例
fun main() {
val nums1 = listOf(1, 2, 3, 4, 5)
val nums2 = listOf(2, 4, 5, 6)
val list = nums1 + nums2
val result = list.filter { item ->
list.count { it == item } == 1
}
println(result)
}
出力:
[1, 3, 6]
groupingBy()
4つ目は、groupingBy()を使う方法です。
まず、2つのリストを結合します。
結合したリストから要素をそのまま返すgroupingBy()を呼び出します。
groupintBy()からeachCount()、eachCount()からfilter()を呼び出します。
filter()のクロージャーで、引数の「value」が「1」の場合に「true」となる条件式を返します。
そして、filter()の結果の「keys」にアクセスします。
//list1, list2=対象の2つのリスト
val result = (list1 + list2).groupingBy { it }
.eachCount()
.filter { it.value == 1 }
.keys
上記のfilter()のkeysにアクセスすることで、対象の2つのリスト(List)の差分を取得できます。
使用例
fun main() {
val nums1 = listOf(1, 2, 3, 4, 5)
val nums2 = listOf(2, 4, 5, 6)
val result = (nums1 + nums2).groupingBy { it }
.eachCount()
.filter { it.value == 1 }
.keys
println(result)
}
出力:
[1, 3, 6]
まとめ
2つのリスト(List)の差分を取得する方法は、次の4つです。
- 「-」演算子を使う方法
val result = list1 - list2
- minus()を使う方法
val result = list1.minus(list2)
- filter()を使う方法
val newList = list1 + list2
val result = newList.filter { item -> newList.count { it == item } == 1}
- groupingBy()を使う方法
val result = (list1 + list2).groupingBy { it }.eachCount().filter { it.value == 1 }.keys
コメント