[Kotlin]2つの配列の差分を取得するには?

どうも、ちょげ(@chogetarou)です。

2つの配列(array)の差分を取得する方法を紹介します。

スポンサーリンク

方法

2つの配列(array)の差分を取得する方法は、2つあります。

filter()

ひとつは、filter()を使う方法です。

まず、2つの配列を結合します。

結合した配列からfilter()を呼び出します。

filter()のクロージャーで、結合した配列から呼び出したcount()の結果が「1」となる場合にtrueとなる条件式を返します。

そして、count()のクロージャーで、引数と配列の要素が等しい時にtrueとなる条件式を返します。

//array1, array2=対象の2つの配列
val newArray = array1 + array2
val result = newArray.filter { item ->
   newArray.count { it == item } == 1 
}

上記のfilter()は、対象の2つの配列(array)の差分を取得します。

使用例

fun main() {
    val nums1 = arrayOf(1, 2, 3, 4, 5)
    val nums2 = arrayOf(2, 4, 5, 6)
    
    val array = nums1 + nums2
    val result = array.filter { item ->
        array.count { it == item } == 1 
    }
    
    println(result)
}
出力:
[1, 3, 6]

groupingBy()

もうひとつは、groupingBy()を使う方法です。

まず、2つの配列(array)を結合します。

結合した配列(array)から要素をそのまま返すgroupingBy()を呼び出します。

groupintBy()からeachCount()、eachCount()からfilter()を呼び出します。

filter()のクロージャーで、引数の「value」が「1」の場合に「true」となる条件式を返します。

そして、filter()の結果の「keys」にアクセスします。

//array1, array2=対象の2つの配列
val result = (array1 + array2).groupingBy { it }
        		.eachCount()
			.filter { it.value == 1 }
        		.keys

上記のfilter()のkeysにアクセスすることで、対象の2つの配列(array)の差分を取得できます。

使用例

fun main() {
    val nums1 = arrayOf(1, 2, 3, 4, 5)
    val nums2 = arrayOf(2, 4, 5, 6)
    
    val result = (nums1 + nums2).groupingBy { it }
        			.eachCount()
				.filter { it.value == 1 }
        			.keys
    
    println(result)
}
出力:
[1, 3, 6]

まとめ

2つの配列(array)の差分を取得する方法は、次の2つです。

  • toMutableList()を使う方法
    val newArray = array1 + array2
    val result = newArray.filter { item -> newArray.count { it == item } == 1 }
  • groupingBy()を使う方法
    val result = (array1 + array2).groupingBy { it }.eachCount() .filter { it.value == 1 }.keys

コメント

タイトルとURLをコピーしました