Треки
/
Java
Java
/
Вправи
/
Мови Карла
Мови Карла

Мови Карла

Навчальна вправа

Вступ

Узагальнені типи

Узагальнений тип - це узагальнений клас або інтерфейс, параметризований типами. Це дає компілятору змогу забезпечувати типобезпеку класу або інтерфейсу.

Розгляньмо цей неузагальнений інтерфейс Container:

class Container {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}

Оскільки він приймає й повертає обʼєкти типу Object, він працює з будь-яким непримітивним типом. Однак за це доводиться платити: якийсь код може викликати get, розраховуючи на Integer, а інший код викликає set, додаючи String, що призводить до винятку часу виконання.

Узагальнений клас і узагальнений інтерфейс мають такий формат:

class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }

Секція параметрів типу, обмежена кутовими дужками (<>), яка йде після назви класу або інтерфейсу, задає параметри типу (які також називають змінними типу) T1, T2, ..., і Tn. Їх можна використовувати всередині тіла класу або інтерфейсу, щоб отримати типобезпеку узагальнень.

Ось узагальнена версія Container:

class Container<E> {
    private E object;

    public void set(E object) { this.object = object; }
    public E get() { return object; }
}

Коли ми його створюємо, нам тепер треба оголосити, який тип він зберігає, і компілятор забезпечить це обмеження:

// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);

Списки

У Java списки - це впорядкована колекція-послідовність. На відміну від масивів, List може збільшуватися в розмірі, щоб умістити будь-яку кількість елементів. Одна зі стандартних реалізацій - це ArrayList, який базується на масиві, розмір якого можна змінювати. Інша стандартна реалізація - це клас LinkedList, який базується на двозвʼязному списку.

List може бути порожнім або містити будь-яку кількість елементів (зокрема дублікати). List - це узагальнений інтерфейс, типізований так, щоб указувати, які типи обʼєктів він може містити. Наприклад:

List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);

List має різні корисні методи, щоб додати елемент, видалити його, отримати або перевірити, чи він наявний:

List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)

Вказівки

Карл хоче вести список мов, які збирається вивчати на сайті Exercism. Карлові потрібно вміти додавати нові мови, видаляти старі та перевіряти, чи є певні мови у списку. Було б дуже захопливо, якби Карл захотів вивчати Java або Kotlin!

1. Визначте функцію, щоб перевірити, чи список мов порожній

Карлові потрібно знати, чи його список мов колись стане порожнім, щоб він міг знайти ще щось для вивчення! Визначте метод під назвою isEmpty, який повертає true, якщо у списку немає жодної мови.

if (languageList.isEmpty()) {
    findMoreLanguagesToLearn();
}

2. Визначте функцію, щоб додати мову до списку

Карл з нетерпінням чекає на вивчення Kotlin і Python! Допоможіть Карлові почати: визначте метод під назвою addLanguage, який приймає мову, яку він хоче вивчати, і додає її до списку.

languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");

3. Визначте функцію, щоб видалити мову зі списку

Карл вирішив, що зараз не хоче вивчати Scala. Допоможіть Карлові видалити її зі списку: визначте метод під назвою removeLanguage, який приймає мову, яку він видаляє, і видаляє її зі списку.

languageList.removeLanguage("Scala");

4. Визначте функцію, яка повертає перший елемент списку

Карл хоче пригадати першу мову, яку він додав до списку (і яка досі в списку). Визначте метод під назвою firstLanguage, який повертає першу мову в списку.

String kotlin = languageList.firstLanguage(); // "Kotlin"

5. Визначте функцію, яка повертає кількість мов у списку

Карлові потрібно знати, скільки мов він намагається вивчити. Допоможіть Карлові знайти відповідь: визначте метод під назвою count, який повертає кількість мов у списку.

int two = languageList.count(); // 2

6. Визначте функцію, щоб визначити, чи мова є у списку

Карл намагається пригадати, чи хотів він вивчати Python або Ruby. Визначте метод під назвою containsLanguage, який приймає мову, про яку він питає, щоб Карл міг це зʼясувати!

boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false

7. Визначте функцію, щоб визначити, чи список захопливий

Якщо Карл хоче вивчати Java або Kotlin, це дуже захопливо! Визначте метод під назвою isExciting, який повертає true, якщо Карл хоче вивчати Java або Kotlin.

javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Java Exercism

Час розпочати Мови Карла?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.