Rutas
/
Java
Java
/
Ejercicios
/
Los lenguajes de Karl
Los lenguajes de Karl

Los lenguajes de Karl

Ejercicio de aprendizaje

Introducción

Tipos genéricos

Un tipo genérico es una clase o interfaz genérica que se parametriza con tipos. Esto permite que el compilador garantice la seguridad de tipos en la clase o la interfaz.

Fíjate en esta interfaz Container, que no es genérica:

class Container {
    private Object object;

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

Como acepta y devuelve tipos Object, funciona con cualquier tipo no primitivo. Sin embargo, esto tiene un precio, porque puede que una parte del código llame a get esperando Integer y otra llame a set añadiendo String, lo que da lugar a una excepción en tiempo de ejecución.

Una clase genérica y una interfaz genérica tienen el siguiente formato:

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

La sección de parámetros de tipo, delimitada por corchetes angulares (<>) y situada a continuación del nombre de la clase o de la interfaz, especifica los parámetros de tipo (también llamados variables de tipo) T1, T2, ..., y Tn. Se pueden usar dentro del cuerpo de la clase o la interfaz para conseguir seguridad de tipos genéricos.

Aquí tienes la versión genérica de Container:

class Container<E> {
    private E object;

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

Al crearlo, ahora tenemos que declarar qué tipo contiene y el compilador hará cumplir esa restricción:

// 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);

List

Las List son la colección de secuencias ordenadas de Java. A diferencia de los arrays, una List puede crecer de tamaño para albergar cualquier número de elementos. Una implementación estándar es ArrayList, que se apoya en un array que se puede redimensionar. Otra implementación estándar es la clase LinkedList, que se apoya en una lista doblemente enlazada.

Las List pueden estar vacías o contener cualquier número de elementos (incluidos los duplicados). Las List son una interfaz genérica tipada para indicar qué tipo de objetos pueden contener. Por ejemplo:

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);

Las List tienen varios métodos útiles para añadir, eliminar, obtener y comprobar si un elemento está presente:

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)

Instrucciones

Karl quiere llevar un registro de un array de lenguajes que aprender en el sitio web de Exercism. Karl necesita poder añadir lenguajes nuevos, eliminar los antiguos y comprobar si ciertos lenguajes están en el array. ¡Sería muy emocionante que Karl quisiera aprender Java o Kotlin!

1. Define una función para comprobar si el array de lenguajes está vacío

Karl necesita saber si su array de lenguajes llega a quedarse vacío, para poder ir a buscar más que aprender. Define un método llamado isEmpty que devuelva true si no hay ningún lenguaje en el array.

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

2. Define una función para añadir un lenguaje al array

¡Karl está deseando aprender Kotlin y Python! Ayuda a Karl a empezar definiendo un método llamado addLanguage que reciba el lenguaje que quiere aprender y lo añada al array.

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

3. Define una función para eliminar un lenguaje del array

Karl ha decidido que no quiere aprender Scala ahora mismo. Ayuda a Karl a eliminarlo del array definiendo un método llamado removeLanguage que reciba el lenguaje que se quiere eliminar y lo elimine del array.

languageList.removeLanguage("Scala");

4. Define una función para devolver el primer elemento del array

Karl quiere recordar el primer lenguaje que añadió al array (que siga estando en el array). Define un método llamado firstLanguage que devuelva el primer lenguaje del array.

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

5. Define una función para devolver cuántos lenguajes hay en el array

Karl necesita saber cuántos lenguajes está intentando aprender. Ayuda a Karl a encontrar la respuesta definiendo un método llamado count que devuelva el número de lenguajes que hay en el array.

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

6. Define una función para determinar si un lenguaje está en el array

Karl intenta recordar si quería aprender Python o Ruby. Define un método llamado containsLanguage que reciba el lenguaje por el que pregunta, ¡para que Karl pueda averiguarlo!

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

7. Define una función para determinar si el array es emocionante

¡Si Karl quiere aprender Java o Kotlin, eso es muy emocionante! Define un método llamado isExciting que devuelva true si Karl quiere aprender Java o Kotlin.

javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Java Exercism

¿Listo para empezar Los lenguajes de Karl?

Regístrate en Exercism para aprender y dominar Java con 26 conceptos158 ejercicios y mentoría humana real, todo gratis.