Tracks
/
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 está parametrizada sobre tipos. Esto permite que el compilador garantice la seguridad de tipos en la clase o interfaz.

Considera 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 costo, porque es posible que parte del código llame a get esperando Integers, mientras que otra parte llama a set agregando Strings, lo que produce una excepción en tiempo de ejecución.

Una clase genérica y una interfaz genérica tienen los siguientes formatos:

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

La sección de parámetros de tipo, delimitada por paréntesis angulares (<>), que sigue al nombre de la clase o interfaz, especifica los parámetros de tipo (también llamados variables de tipo) T1, T2, ..., y Tn. Estos se pueden usar dentro del cuerpo de la clase o de la interfaz para obtener seguridad de tipos genéricos.

Aquí está 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; }
}

Cuando lo creamos, 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);

Listas

Las listas son la colección de secuencia ordenada en Java. A diferencia de los arrays, una List puede crecer en tamaño para admitir cualquier cantidad de elementos. Una implementación estándar es ArrayList, que se basa en un array redimensionable. Otra implementación estándar es la clase LinkedList, que se basa en una lista doblemente enlazada.

Las List pueden estar vacías o contener cualquier cantidad de elementos (incluidos los duplicados). Las List son una interfaz genérica parametrizada 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 agregar, 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 una lista de lenguajes que quiere aprender en el sitio web de Exercism. Karl necesita poder agregar lenguajes nuevos, eliminar los antiguos y comprobar si ciertos lenguajes están en la lista. ¡Sería muy emocionante si Karl quiere aprender Java o Kotlin!

1. Define una función para comprobar si la lista de lenguajes está vacía

Karl necesita saber si en algún momento su lista de lenguajes queda vacía, para poder ir a buscar más que aprender. Define un método llamado isEmpty que devuelve true si no hay lenguajes en la lista.

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

2. Define una función para agregar un lenguaje a la lista

¡Karl está ansioso por aprender Kotlin y Python! Ayuda a Karl a empezar definiendo un método llamado addLanguage que recibe el lenguaje que quiere aprender y lo agrega a la lista.

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

3. Define una función para eliminar un lenguaje de la lista

Karl decidió que por ahora no quiere aprender Scala. Ayuda a Karl a eliminarlo de la lista definiendo un método llamado removeLanguage que recibe el lenguaje que va a eliminar y lo quita de la lista.

languageList.removeLanguage("Scala");

4. Define una función para devolver el primer elemento de la lista

Karl quiere recordar el primer lenguaje que agregó a la lista (que todavía sigue en la lista). Define un método llamado firstLanguage que devuelve el primer lenguaje de la lista.

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

5. Define una función que devuelva cuántos lenguajes hay en la lista

Karl necesita saber cuántos lenguajes está intentando aprender. Ayuda a Karl a encontrar la respuesta definiendo un método llamado count que devuelve la cantidad de lenguajes en la lista.

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

6. Define una función para determinar si un lenguaje está en la lista

Karl está tratando de recordar si quería aprender Python o Ruby. Define un método llamado containsLanguage que recibe 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 la lista es emocionante

¡Si Karl quiere aprender Java o Kotlin, eso es muy emocionante! Define un método llamado isExciting que devuelve 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 una pestaña nuevas
Java Exercism

¿Todo 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.