[Kotlin] - Pair

Pairλž€

Pairλž€, ν•œ 쌍;두 뢀뢄이 ν•¨κ»˜ λΆ™μ–΄ ν•˜λ‚˜λ₯Ό μ΄λ£¨λŠ” 것을 μ˜λ―Έν•œλ‹€.

kotlinμ—μ„œλ„ λ™μΌν•˜κ²Œ μŒμ„ μ˜λ―Έν•˜λŠ” 클래슀이며, 클래슀 κ΅¬μ‘°λŠ” μ•„λž˜μ™€ 같이 생겼닀.

public data class Pair<out A, out B>(
    public val first: A,
    public val second: B
) : Serializable

μžμ„Έν•œ λ‚΄μš©μ€ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€.

Pair의 μ‚¬μš©

μ•žμ„œ μ„€λͺ…ν•œ 것과 같이 2개의 λ³€μˆ˜λ₯Ό λ¬Άμ–΄μ„œ μ‚¬μš©ν•  수 있으며, μ–΄λ– ν•œ νƒ€μž…μ΄λ“  넣을 수 μžˆλ‹€.

데이터 μ €μž₯

μ•„λž˜ μ½”λ“œμ™€ 같이 λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€.

var a = Pair(1, "짱ꡬ")
val b = Pair<Int, String>(second = "철수", first = 2)
val (c1, c2) = Pair(3, "유리")
val (d1, d2) = 4 to "ν›ˆλ°œλ‘¬"

μ•½κ°„ μƒμ†Œν•œ μ½”λ“œκ°€ μžˆλ‹€λ©΄ c1, c2 λ³€μˆ˜λ₯Ό κ΄„ν˜Έλ‘œ λ¬Άμ–΄ μ‚¬μš©ν•˜λŠ” 것이닀. Pairκ°€ ν•œ μŒμ„ μ˜λ―Έν•˜λŠ” κ²ƒμ²˜λŸΌ ν•œ 쌍의 λ³€μˆ˜λ‘œ λ¬Άμ–΄μ„œ μ‚¬μš©ν•˜λŠ” 것이닀.

데이터 좜λ ₯

좜λ ₯은 Pair의 첫 뢀뢄을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ firstλ₯Ό ν˜ΈμΆœν•˜κ³ , 두 번째 뢀뢄을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ secondλ₯Ό ν˜ΈμΆœν•˜λ©΄ λœλ‹€.

println("a.first = ${a.first} \t a.second = ${a.second}")

println("a = $a")

println("c.first = $c1 \t c.second = $c2")

// a.first = 1 	 a.second = 짱ꡬ
println("a.first = ${a.first} \t a.second = ${a.second}")
// a = (1, 짱ꡬ)
println("a = $a")

// b.first = 2 	 b.second = 철수
println("b.first = ${b.first} \t b.second = ${b.second}")
// b = (2, 철수)
println("b = $b")

// c.first = 3   	 c.second = 유리
println("c.first = $c1 \t c.second = $c2")

// d.first = 4 	     d.second = ν›ˆλ°œλ‘¬
println("d.first = $d1 \t d.second = $d2")

데이터 μˆ˜μ •

μ•žμ„œ 클래슀 ꡬ쑰λ₯Ό 보면 μ•Œλ“―μ΄ val둜 λ˜μ–΄ μžˆμ–΄μ„œ 데이터λ₯Ό μˆ˜μ •ν•  수 μ—†λ‹€. κ·ΈλŸΌμ—λ„ κΌ­ μˆ˜μ •μ΄ ν•„μš”ν•œ 경우 copyλ₯Ό 톡해 λ‹€μ‹œ ν• λ‹Ήν•˜λŠ” λ°©μ‹μœΌλ‘œ ν•  수 μžˆλ‹€.

a = a.copy(first = 5, second = "돌")

데이터 μ •λ ¬

PairλŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ™€ λ‹€λ₯΄κ²Œ PriorityQueueλ₯Ό 톡해 μ •λ ¬ν•  수 μ—†λ‹€.

fun main() {
    val pq = PriorityQueue<Pair<Int, Int>>()
    pq.offer(1 to 1)
    pq.offer(2 to 2)

    while (!pq.isEmpty()) {
        val cur = pq.poll()

        println(cur.first)
    }
}

μœ„μ™€ 같이 μž‘μ„±ν•˜λ©΄ 컴파일 νƒ€μž„μ—λŠ” μ—λŸ¬λ‚˜ λ‚˜μ§€ μ•Šμ§€λ§Œ, λŸ°νƒ€μž„μ—μ„œ μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

Exception in thread "main" java.lang.ClassCastException: 
class kotlin.Pair cannot be cast to class java.lang.Comparable 
(kotlin.Pair is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')

μ—λŸ¬ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄λ©΄ Pair ν΄λž˜μŠ€λŠ” Comparable둜 μΊμŠ€νŠΈν•  수 μ—†λ‹€λŠ” λ‚΄μš©μ΄λ‹€. 즉, Comparable을 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„ 무엇과 비ꡐλ₯Ό ν•΄μ„œ 정렬할지 μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λŠ” 것이닀.

이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 생각보닀 κ°„λ‹¨ν•˜λ‹€.

// 방식 1
val pq = PriorityQueue<Pair<Int, Int>>(Comparator() { a, b -> a.first - b.first })

// 방식 2
val pq = PriorityQueue<Pair<Int, Int>> { a, b -> a.first - b.first }

μœ„μ™€ 같이 Comparatorλ₯Ό μ œκ³΅ν•΄ 정렬을 ν•΄μ£Όλ©΄ λœλ‹€.

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°