Друкарня від WE.UA

Порівняння рішень на Java, Kotlin та Scala

Давайте розглянемо, як задачу https://leetcode.com/problems/relative-ranks/solutions/6326961/sorting-mapping-approach можна вирішити трьома мовами програмування — Java, Kotlin та Scala.

Проблема: Знаходимо відносні ранги

Маючи масив балів (int[] score), необхідно присвоїти ранги, як-от "Золота медаль", "Срібна медаль" та "Бронзова медаль" для трьох найкращих, а іншим гравцям — числовий ранг. Основна мета — написати оптимальний і зрозумілий код.

Рішення на Java: Класика, потужність, боілерплейт

class Solution {
    public String[] findRelativeRanks(int[] score) {
        int[] sorted =
                Arrays.stream(score)
                        .boxed()
                        .sorted(Collections.reverseOrder())
                        .mapToInt(Integer::intValue)
                        .toArray();

        Map<Integer, Integer> rankMap = new HashMap<>();
        for (int i = 0; i < sorted.length; i++) {
            rankMap.put(sorted[i], i);
        }

        return Arrays.stream(score)
                .mapToObj(individualScore -> {
                    int rank = rankMap.get(individualScore);
                    return switch (rank) {
                        case 0 -> "Gold Medal";
                        case 1 -> "Silver Medal";
                        case 2 -> "Bronze Medal";
                        default -> String.valueOf(rank + 1);
                    };
                })
                .toArray(String[]::new);
    }
}

Java може здатися дещо громіздкою, особливо для роботи з колекціями.

Другий пункт коду, де ми створюємо rankMap, реалізований у імперативному стилі. Java, на жаль, не має синтаксичних конструкцій, які дозволили б виразно та читабельно написати цю частину декларативно. Тому я обрав імперативний підхід, щоб забезпечити чіткість та простоту логіки.

Рішення на Kotlin: Сучасний підхід

class Solution {
    fun findRelativeRanks(score: IntArray): Array<String> {
        val rankMap =
            score.sortedArrayDescending()
                .withIndex()
                .associate { (index, value) -> value to index }

        return score.map { mapScoreToRank(it, rankMap) }.toTypedArray()
    }

    private fun mapScoreToRank(score: Int, rankMap: Map<Int, Int>): String {
        return when (val index = rankMap.getValue(score)) {
            0 -> "Gold Medal"
            1 -> "Silver Medal"
            2 -> "Bronze Medal"
            else -> (index + 1).toString()
        }
    }
}

Переваги Kotlin:

  • Зрозумілі трансформації: Функції sortedArrayDescending і withIndex роблять процес сортування й індексації простим.

  • Мінімум шуму: Здатність Kotlin виводити типи автоматично скорочує код.

  • Логічний поділ: Хелпер mapScoreToRank додає ясності.

Рішення на Scala: Елегантність функціонального підходу

Scala виводить лаконічність на новий рівень, пропонуючи компактні й виразні рішення:

object Solution {
  def findRelativeRanks(score: Array[Int]): Array[String] = {
    val rankMap =
      score.sorted(Ordering[Int].reverse)
        .zipWithIndex
        .toMap
    score.map(rankMap.andThen(indexToRank))
  }

  private val indexToRank: Int => String = {
    case 0 => "Gold Medal"
    case 1 => "Silver Medal"
    case 2 => "Bronze Medal"
    case i => (i + 1).toString
  }
}

Особливості Scala:

  • Ланцюжки трансформацій: Функції zipWithIndex і toMap створюють лаконічний і зрозумілий код.

  • Вищі функції: Композиція через andThen додає елегантності.
    Мене вразив Scala тим, що можна комбінувати Map і функцію rankMap.andThen(indexToRank). У інших мовах функцію можна композувати лише з іншою функцією.

  • Патерн-матчинг: Дозволяє перетворювати ранги у медалі або числа без зайвих деталей.

Scala ідеально підходить для тих, хто захоплюється функціональним підходом до програмування.

Порівняння продуктивності

Усі три рішення мають схожі етапи: сортування, мапування й форматування результатів. Основна складність визначається операцією сортування (O(n log n)), що забезпечує ефективність у всіх випадках. Вибір мови зводиться до особистих уподобань та досвіду команди.

Статті про вітчизняний бізнес та цікавих людей:

  • Шлейф сучасного смартфону та його призначення

    Шлейф - це тонка пластикова стрічка з ледь видимими доріжками і саме вона зʼєднує важливі компоненти мобільного, без яких він не запрацює. Власники пристроїв Xiaomi, які стикаються з потребою заміни цієї деталі, можуть підібрати відповідний варіант на сайті AKS.UA

    Теми цього довгочиту:

    Шлейф Для Мобільного
  • Чохли для iPhone 15: повний гід по кольорах, матеріалах і виробниках

    Перед тим як вибрати чохли для iPhone 15, варто визначитися, що саме ви хочете отримати від аксесуара. Комусь потрібен тонкий прозорий корпус, інший покупець шукає посилений захист, а для когось вирішальним стане колір або підтримка MagSafe

    Теми цього довгочиту:

    Чохли Для Iphone
  • Як побудована програма Meest China Academy

    Курс про товарний бізнес охоплює різні етапи роботи: від пошуку ідеї до перевірки товару, логістики та масштабування. Програма Meest China Academy містить 17 модулів, які послідовно розкривають ці теми без зведення всього навчання до однієї універсальної поради.

    Теми цього довгочиту:

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

    Теми цього довгочиту:

    Iphone 17
  • Як вибрати вживаний iPhone: коротке керівництво для розумної покупки

    Вторинний ринок смартфонів Apple активно зростає, і питання, як вибрати вживаний iPhone, стає актуальним для дедалі більшої кількості користувачів. Правильний підхід дозволяє отримати бу iPhone з актуальною iOS і доброю камерою за помітно нижчу ціну, ніж у нових пристроїв.

    Теми цього довгочиту:

    Iphone
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Edgar
Edgar@avuzi

Back-end розробник Java Kotlin

3Довгочити
88Перегляди
На Друкарні з 12 грудня 2024

Більше від автора

Це також може зацікавити:

  • нотатки або блокнот Windows

    нотатки Obsidian, або Logseq зберігають ваші нотатки як звичайні текстові файли у форматі Markdown. Це означає, що ваші дані залишаються доступними для читання навіть без програми — відкрийте нотатки в будь-якому текстовому редакторі, і вони будуть повністю доступні.

    Теми цього довгочиту:

    Програмування
  • Як виводити у консолі смайли із застосуванням emoji?

    У цій статті ми розберемося як виводити у консолі не лише текст, а й емоджі та, також, розглянемо функції для роботи з ними. Тож, для цього ми будемо використовувати бібліотеку emoji, яка дозволяє працювати з різного роду смайлами.

    Теми цього довгочиту:

    Програмування

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити:

  • нотатки або блокнот Windows

    нотатки Obsidian, або Logseq зберігають ваші нотатки як звичайні текстові файли у форматі Markdown. Це означає, що ваші дані залишаються доступними для читання навіть без програми — відкрийте нотатки в будь-якому текстовому редакторі, і вони будуть повністю доступні.

    Теми цього довгочиту:

    Програмування
  • Як виводити у консолі смайли із застосуванням emoji?

    У цій статті ми розберемося як виводити у консолі не лише текст, а й емоджі та, також, розглянемо функції для роботи з ними. Тож, для цього ми будемо використовувати бібліотеку emoji, яка дозволяє працювати з різного роду смайлами.

    Теми цього довгочиту:

    Програмування