[Kotlin]2つのリストの差分を取得するには?

Kotlin

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

2つのリスト(List)の差分を取得する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

2つのリスト(List)の差分を取得する方法は、4つあります。

「-」演算子

1つ目は、「-」演算子を使う方法です。

具体的な方法としては、「-」演算子の両辺に対象の2つのリストを指定します。

//list1, list2=対象の2つのリスト
val result = list1 - list2

上記の「-」演算子は、両辺のリスト(List)の差分をリストとして取得します。

「-」演算子は、左辺にあって右辺のリストに無い要素を取得します。

なので、「-」演算子は、両辺の2つのリストの順番を変えると、結果が変わります。

使用例

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)の差分をリストとして取得します。

minus()は、呼び出したリストにあって引数のリストに無い要素を取得します。

なので、2つのリストを呼び出す側と引数に指定する側のどちらにするかで、結果が変わります。

使用例

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

コメント

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