Сопоставимые массивы в Котлине - PullRequest
0 голосов
/ 01 июля 2018

Исходя из мира Swift, я пытаюсь понять, как использовать сопоставимые функции, такие как min() или max(), в массиве объектов. В Swift я бы использовал сопоставимый протокол -

class Car: Comparable {
    let year: Int

    static func < (lhs: Car, rhs: Car) -> Bool {
        return lhs.year < rhs.year
    }

    static func == (lhs: Car, rhs: Car) -> Bool {
        return lhs.year == rhs.year
    }
}

Но как бы вы поступили так же в Котлине? Я пробовал это, но я не уверен, что это правильный подход, или как я бы реализовал итерируемую функцию -

data class Car(val year: Int): Comparable<Car>, Iterable<Car> {

    override fun compareTo(other: Car) = when {
        this.year < other.year -> -1
        this.year > other.year -> 1
        else -> 0
    }

    override fun iterator(): Iterator<Car> {
        TODO("not implemented")
    }

}

1 Ответ

0 голосов
/ 01 июля 2018

Относительно вашей реализации проблем нет, но вы могли бы упростить ее:

data class Car(val year: Int): Comparable<Car> {
    override fun compareTo(other: Car) = year - other.year
}

Не следует реализовывать интерфейс Iterable, потому что это сделает Car своего рода коллекцией.

Запуск следующего примера с заданной реализацией Car

listOf(Car(2004), Car(2007), Car(2001)).run {
    println(this)
    println(min())
    println(max())
    println(sorted())
}

возвращает результат

[Car(year=2004), Car(year=2007), Car(year=2001)]
Car(year=2001)
Car(year=2007)
[Car(year=2001), Car(year=2004), Car(year=2007)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...