diff --git a/src/main/kotlin/ru/otus/homework/Main.kt b/src/main/kotlin/ru/otus/homework/Main.kt new file mode 100644 index 0000000..f581ee4 --- /dev/null +++ b/src/main/kotlin/ru/otus/homework/Main.kt @@ -0,0 +1,54 @@ +package ru.otus.homework + +import ru.otus.homework.mapswap.swap +import ru.otus.homework.persons.Person +import ru.otus.homework.persons.sortByAge +import ru.otus.homework.persons.sortByName + +fun main() { + + val persons = listOf( + Person("Ivan", "Petrov", 10), + Person("Sergey", "Petrov", 35), + Person("Tatyana", "Petrova", 36), + Person("Natalya", "Sidorova", 50), + Person("Nilolay", "Zatochkin", 65) + ) + + println("1. Сортировка справочника по возрасту") + println("sortByAge:") + persons.sortByAge().forEach(::println) + println() + + println("2. Сортировка справочника по имени") + println("sortByName:") + persons.sortByName().forEach(::println) + println() + + println("3. Переворот Map") + val sourceMap = mapOf( + 1 to "one", + 2 to "two", + 3 to "three" + ) + println("sourceMap:") + sourceMap.forEach { (key, value) -> println("$key -> $value") } + println("swap:") + sourceMap.swap().forEach { (key, value) -> println("$key -> $value") } + println() + + println("4. Собственный List") + val naturalList = NaturalList(5) + println("naturalList: $naturalList") + println("subList(1, 3): ${naturalList.subList(1, 3)}") + println("containsAll(listOf(1, 2, 3, 4, 5)): ${naturalList.containsAll(listOf(1, 2, 3, 4, 5))}") + println("containsAll(listOf(1, 2, 3, 4, 5, 6)): ${naturalList.containsAll(listOf(1, 2, 3, 4, 5, 6))}") + println() + + println("5. equals() и hashCode() для списка") + val kotlinList = listOf(1, 2, 3, 4, 5) + println("naturalList == kotlinList: ${naturalList == kotlinList}") + println("kotlinList == naturalList: ${kotlinList == naturalList}") + println("naturalList.hashCode(): ${naturalList.hashCode()}") + println("kotlinList.hashCode(): ${kotlinList.hashCode()}") +} diff --git a/src/main/kotlin/ru/otus/homework/NaturalList.kt b/src/main/kotlin/ru/otus/homework/NaturalList.kt index a8a41b1..096a1b9 100644 --- a/src/main/kotlin/ru/otus/homework/NaturalList.kt +++ b/src/main/kotlin/ru/otus/homework/NaturalList.kt @@ -35,14 +35,20 @@ class NaturalList(n: Int) : List { * Вернуть под-список этого списка, включая [fromIndex] и НЕ включая [toIndex] */ override fun subList(fromIndex: Int, toIndex: Int): List { - TODO("Not yet implemented") + if (fromIndex < 0 || toIndex > size) { + throw IndexOutOfBoundsException("fromIndex=$fromIndex, toIndex=$toIndex, size=$size") + } + if (fromIndex > toIndex) { + throw IllegalArgumentException("fromIndex=$fromIndex > toIndex=$toIndex") + } + return List(toIndex - fromIndex) { index -> fromIndex + index + 1 } } /** * Returns true if list contains all numbers in the collection */ override fun containsAll(elements: Collection): Boolean { - TODO("Not yet implemented") + return elements.all(::contains) } override fun toString(): String { @@ -53,13 +59,25 @@ class NaturalList(n: Int) : List { * Функция должна возвращать true, если сравнивается с другой реализацией списка тех же чисел * Например, NaturalList(5) должен быть равен listOf(1,2,3,4,5) */ - override fun equals(other: Any?): Boolean = false + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is List<*>) return false + if (size != other.size) return false + + return indices.all { index -> this[index] == other[index] } + } /** * Функция должна возвращать тот же hash-code, что и список другой реализации тех же чисел * Например, NaturalList(5).hashCode() должен быть равен listOf(1,2,3,4,5).hashCode() */ - override fun hashCode(): Int = -1 + override fun hashCode(): Int { + var result = 1 + for (element in this) { + result = 31 * result + element.hashCode() + } + return result + } } private class NaturalIterator(private val n: Int) : Iterator { @@ -88,4 +106,4 @@ private class NaturalListIterator(private val n: Int, index: Int = 0) : ListIter throw NoSuchElementException() } override fun previousIndex(): Int = index -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/otus/homework/mapswap/mapSwap.kt b/src/main/kotlin/ru/otus/homework/mapswap/mapSwap.kt index 913be37..19856f2 100644 --- a/src/main/kotlin/ru/otus/homework/mapswap/mapSwap.kt +++ b/src/main/kotlin/ru/otus/homework/mapswap/mapSwap.kt @@ -3,4 +3,4 @@ package ru.otus.homework.mapswap /** * Меняет местами ключи и значения */ -fun Map.swap(): Map = TODO("Доделать swap") \ No newline at end of file +fun Map.swap(): Map = entries.associate { (key, value) -> value to key } diff --git a/src/main/kotlin/ru/otus/homework/persons/persons.kt b/src/main/kotlin/ru/otus/homework/persons/persons.kt index fc1265d..156a94a 100644 --- a/src/main/kotlin/ru/otus/homework/persons/persons.kt +++ b/src/main/kotlin/ru/otus/homework/persons/persons.kt @@ -3,11 +3,11 @@ package ru.otus.homework.persons /** * Отсортировать список персон по возрасту в порядке убывания */ -fun List.sortByAge(): List = TODO("Доделать sortByAge") +fun List.sortByAge(): List = sortedByDescending { it.age } /** * Отсортировать список персон по фамилии * - Фамилии сортируются по алфавиту в порядке возрастания * - Если фамилии совпадают, персоны сортируются по имени в порядке возрастания */ -fun List.sortByName(): List = TODO("Доделать sortBySurname") \ No newline at end of file +fun List.sortByName(): List = sortedWith(compareBy(Person::surname, Person::name))