package basic.c05_structures;

/*
Clase 41 - Listas
Vídeo: https://youtu.be/JOAqpdM36wI?t=12233
*/

import java.util.ArrayList;

public class Lists {

    public static void main(String[] args) {

        // Declaración y creación
        ArrayList<String> names = new ArrayList<>();
        var numbers = new ArrayList<Integer>();

        // Tamaño

        System.out.println(names.size());

        // Inserción

        names.add("Brais");
        names.add("Moure");
        names.add("MoureDev");
        System.out.println(names.size());

        // Acceso

        System.out.println(names.getFirst());
        System.out.println(names.get(1));
        System.out.println(names.getLast());

        // Modificación

        names.set(2, "mouredev@gmail.com");
        System.out.println(names.getLast());

        // Eliminación

        names.remove(2);
        // System.out.println(names.get(2)); // Error
        System.out.println(names.size());

        // Búsqueda

        System.out.println(names.contains("Brais"));
        System.out.println(names.contains("mouredev@gmail.com"));

        // Limpieza

        names.add("Brais");
        System.out.println(names);
        names.clear();
        System.out.println(names.size());

    }
}

package basic.c05_structures;

/*
Clase 43 - Maps
Vídeo: https://youtu.be/JOAqpdM36wI?t=14574
*/

import java.util.HashMap;

public class Maps {

    public static void main(String[] args) {

        // Declaración y creación
        HashMap<String, String> names = new HashMap<>();
        var numbers = new HashMap<Integer, String>();

        // Tamaño

        System.out.println(names.size());

        // Inserción

        names.put("Brais", "brais@gmail.com");
        names.put("Moure", "moure@gmail.com");
        names.put("MoureDev", "mouredev@gmail.com");
        System.out.println(names.size());
        System.out.println(names);

        // Acceso

        System.out.println(names.get("Moure"));
        System.out.println(names.get("Dev"));

        // Verificación

        System.out.println(names.containsKey("Moure"));
        System.out.println(names.containsKey("Dev"));

        System.out.println(names.containsValue("moure@gmail.com"));

        // Eliminación

        System.out.println(names.remove("Moure"));
        System.out.println(names.remove("MoureDev"));
        System.out.println(names);

        // Limpieza

        names.clear();
        System.out.println(names);

        // Modificación

        names.put("Brais", "brais@gmail.com");
        System.out.println(names);

        names.put("Brais", "braismouredev@gmail.com");
        System.out.println(names);

        names.replace("Moure", "mouredev@gmail.com"); // Reemplaza el valor si existe
        System.out.println(names);

        names.putIfAbsent("Moure", "mouredev@gmail.com"); // Solo lo añade si no existe
        System.out.println(names);

        // Otras operaciones

        System.out.println(names.isEmpty());
        var values = names.values();
        System.out.println(values);
     }
}

package basic.c06_loops;

/*
Clase 45 - Bucles
Vídeo: https://youtu.be/JOAqpdM36wI?t=15862
*/

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class Loops {

    public static void main(String[] args) {

        // Loops

        /*
        Clase 46 - for
        Vídeo: https://youtu.be/JOAqpdM36wI?t=16003
        */

        // - for controlado por contador

        for (int index = 0; index < 5; index++) {
            System.out.println("Hola, Java!");
        }

        String[] names = {"Brais", "Moure", "mouredev"};

        for (int index = 0; index < names.length; index++) {
            System.out.println(names[index]);
        }

        /*
        Clase 47 - forEach
        Vídeo: https://youtu.be/JOAqpdM36wI?t=16646
        */

        // - for-each

        for (String name: names) {
            System.out.println(name);
        }

        HashSet<Integer> numbers = new HashSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        for (Integer number: numbers) {
            System.out.println(number);
        }

        HashMap<String, String> emails = new HashMap<>();
        emails.put("Brais", "brais@gmail.com");
        emails.put("Moure", "moure@gmail.com");
        emails.put("MoureDev", "mouredev@gmail.com");

        for (Map.Entry<String, String> email: emails.entrySet()) {
            System.out.println(email.getKey());
            System.out.println(email.getValue());
        }

        /*
        Clase 48 - while / do while
        Vídeo: https://youtu.be/JOAqpdM36wI?t=17199
        */

        // - while

        int index = 0;
        while (index < 5) {
            System.out.println("Hola, Java!");
            index++;
        }

        index = 0;
        while (index < names.length) {
            System.out.println(names[index]);
            index++;
        }

        index = 0;
        boolean find = false;
        while (!find) {
            System.out.println(names[index]);
            if (names[index].equals("Moure")) {
                find = true;
            }
            index++;
        }

        // - do-while

        index = 0;
        do {
            System.out.println("Hola, Java!");
            index++;
        } while (index < 0);

        /*
        Clase 49 - Control de bucles
        Vídeo: https://youtu.be/JOAqpdM36wI?t=17688
        */

        // Control de bucles

        // - break

        for (String name: names) {
            if (name.equals("Moure")) {
                break;
            }
            System.out.println(name);
        }

        // - continue

        for (int i = 0; i < 5; i++) {
            if (i == 3) {
                continue;
            }
            System.out.println(i);
        }
    }
}

package basic.c05_structures;

/*
Clase 40 - Arrays
Vídeo: https://youtu.be/JOAqpdM36wI?t=11194
*/

public class Arrays {

    public static void main(String[] args) {

        // Declaración y creación
        int[] numbers = new int[3];
        System.out.println(numbers);

        String[] names = {"Brais", "Moure", "mouredev"};
        System.out.println(names);

        // Acceso
        System.out.println(numbers[0]);
        System.out.println(names[0]);

        System.out.println((new String[3])[0]);

        // Modificación
        numbers[0] = 1;
        numbers[1] = 10;
        System.out.println(numbers[0]);
        System.out.println(numbers[1]);

        // numbers[3] = 2; Error

        System.out.println(names[2]);
        names[2] = "mouredev@gmail.com";
        System.out.println(names[2]);

        System.out.println(names.length);
        names[2] = null;
        System.out.println(names[2]);
        System.out.println(names.length);

        // numbers[2] = null; Error

        boolean[] booleans = new boolean[5];
        System.out.println(booleans[4]);
    }
}

package basic.c07_functions;

import java.util.ArrayList;
import java.util.Arrays;

public class Functions {

    public static void main(String[] args) {

        /*
        Clase 51 - Funciones
        Vídeo: https://youtu.be/JOAqpdM36wI?t=186100
        */

        // Funciones

        for (int index = 0; index < 5; index++) {
            sendEmail();
        }

        // ...

        sendEmail();

        sendEmailToUser("brais@gmail.com");
        sendEmailToUser("brais@gmail.com", "Brais");

        var users = new ArrayList<>(Arrays.asList("brais@gmail.com", "moure@gmail.com"));
        sendEmailToUser(users);

        var state = sendEmailWithState("brais@gmail.com");
        System.out.println(state);

        System.out.println(sendEmailWithState(""));
    }

    /*
    Clase 52 - Funciones sin parámetros ni retorno
    Vídeo: https://youtu.be/JOAqpdM36wI?t=18394
    */

    // Función sin parámetros ni retorno

    public static void sendEmail() {
        System.out.println("Se envía el email");
    }

    /*
    Clase 53 - Funciones con parámetros / Sobrecarga
    Vídeo: https://youtu.be/JOAqpdM36wI?t=18827
    */

    // Función con parámetros

    public static void sendEmailToUser(String email) {
        System.out.println("Se envía el email a " + email);
    }

    // Sobrecarga de funciones

    public static void sendEmailToUser(String email, String name) {
        System.out.println("Se envía el email a " + name + " (" + email + ")");
    }

    public static void sendEmailToUser(ArrayList<String> emails) {
        for (String email: emails) {
            sendEmailToUser(email);
        }
    }

    /*
    Clase 54 - Funciones con retorno
    Vídeo: https://youtu.be/JOAqpdM36wI?t=19027
    */

    // Función con retorno

    public static boolean sendEmailWithState(String email) {

        if (email.isEmpty()) {
            return false;
        }

        System.out.println("Se envía el email a " + email);
        return true;
    }
}

package basic.c10_extras;

/*
Clase 74 - Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=30409
*/

import basic.c08_oop.Classes;
import basic.c08_oop.Person;

import java.util.Scanner;
//import basic.c08_oop.*;

public class Extras {

    static String globalName = "mouredev";

    public static void main(String[] args) {

        // Extras

        // null

        String name = "Brais";
        name = null;
        if (name != null) {
            System.out.println(name.toLowerCase());
        }

        // import

        new Person("Brais", 18, "1");
        new Classes();

        // Scanner

        var scanner = new Scanner(System.in);

        System.out.println("Introduce tu edad: ");
        var age = scanner.nextInt();

        System.out.println("La edad es: " + age);

        // Scope: variables globales y locales

        test();

        // static
    }

    public static void test() {
        System.out.println(globalName);
    }
}

package basic.c09_exceptions;

/*
Clase 69 - Excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=27930
*/

public class Exceptions {

    public static void main(String[] args) {

        // Manejo de excepciones

        // try catch
        try {
            var result = 10 / 0;
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e);
        }

        // try con múltiples catch
        try {
            var result = 10 / 5;
            System.out.println(result);

            var name = "Brais";
            name = null;
            System.out.println("Name: " + name.toUpperCase());
        } catch (ArithmeticException e) {
            System.out.println("Cuidado con dividir algo que no puedes: " + e);
        } catch (NullPointerException e) {
            System.out.println("Ha ocurrido un null pointer mítico!");
        } catch (Exception e) {
            System.out.println("Se ha producido un error no esperado");
        }

        // finally
        try {
            var result = 10 / 0;
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e);
        } finally {
            System.out.println("Fin del bloque try-catch");
        }

        // throw
        var throwExample = new ThrowExample();
        try {
            throwExample.checkAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println("Error revisando la edad: " + e.getMessage());
        }

        // Excepción personalizada
        try {
            throwExample.checkScore(450);
        } catch (CustomException e) {
            System.out.println("Error revisando la puntuación: "+ e.getMessage());
        }

        System.out.println("Fin");
    }
}

package basic.c08_oop;

/*
Clase 57 - Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=19902
*/

public class Classes {

    public static void main(String[] args) {

        var person = new Person("Brais", -38, "123456789A");

//        person.name = "Brais";
//        person.age = 38;

        person.sayHello();

        person.name = "Brais Moure";
        System.out.println(person.name);

//        person.id = "123456789A";

        System.out.println(person.getId());

        person.setAge(38);
        System.out.println(person.getAge());

        var person2 = new Person("MoureDev", 18, "123456789B");
        person2.sayHello();
    }
}

package basic.c03_strings;

public class Strings {

    public static void main(String[] args) {

        /*
        Clase 24 - Strings
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8140
        */

        // Declaración

        String name = "Brais";
        var surname = new String("Moure");

        // Operaciones básicas

        /*
        Clase 25 - Concatenación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8367
        */

        // Concatenación
        System.out.println(name + " " + surname);

        /*
        Clase 26 - length
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8469
        */

        // Longitud
        System.out.println(name.length());

        /*
        Clase 27 - charAt
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8535
        */

        // Obtener carácter
        System.out.println(name.charAt(name.length() - 1));

        /*
        Clase 28 - substring
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8707
        */

        // Subcadena
        System.out.println(name.substring(2));
        System.out.println(name.substring(1, 3));

        /*
        Clase 29 - toUpperCase / toLowerCase
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8831
        */

        // Mayúsculas y minúsculas
        System.out.println(name.toUpperCase());
        System.out.println(name.toLowerCase());

        System.out.println(name);

        /*
        Clase 30 - contains
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8947
        */

        // Comprobar si contiene
        System.out.println("Hola, Java".contains("Brais"));
        System.out.println("Hola, Java".toUpperCase().contains("AVA"));

        /*
        Clase 31 - equals
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9118
        */

        // Comparación
        System.out.println(name.equals("Brais"));
        System.out.println(name.equals("brais"));
        System.out.println(name.equalsIgnoreCase("brais"));

        // == vs. equals

        var a = "Brais";
        var b = "Brais";
        var c = new String("Brais");

        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(a.equals(c));

        /*
        Clase 32 - trim y replace
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9456
        */

        // Trim
        System.out.println(" Hola, me llamo Brais ".trim());

        // Replace
        System.out.println(" Hola, me llamo Brais ".replace("Brais", "Moure"));

        /*
        Clase 33 - format
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9613
        */

        // Format
        var age = 37;
        System.out.println(String.format("Hola, %s. Tengo %d.", name, age));
    }
}

package basic.c01_beginner;

/*
Clase 15 - Variables y constantes
Vídeo: https://youtu.be/JOAqpdM36wI?t=5294
*/

public class VariablesAndConstants {

    public static void main(String[] args) {

        // Variables

        String name = "Brais";
        System.out.println(name);

        name = "MoureDev";
        System.out.println(name);

        // name = 37; Error (no podemos cambiar el tipo de dato)

        int age = 37;
        System.out.println(age);

        var email = "mouredev@gmail.com";
        System.out.println(email);

        var year = 2025;
        System.out.println(year);

        // Constantes

        final String EMAIL = "mouredev@gmail.com";
        // EMAIL = "brais@gmail.com"; Es constante
        System.out.println(EMAIL);
    }
}

package basic.c08_oop;

/*
Clase 61 - Herencia
Vídeo: https://youtu.be/JOAqpdM36wI?t=23334
*/

public class Inheritance {

    public static void main(String[] args) {

        // Herencia ("es un")

        var animal = new Animal("Mi animal");
//        animal.name = "Mi animal";
        animal.eat();

        var dog = new Dog("Mou", 3);
//        dog.name = "Mou";
        dog.eat();

        var cat = new Cat("Cou");
//        cat.name = "Cou";
        cat.eat();

        var bird = new Bird("Bou");
//        bird.name = "Bou";
        bird.eat();
        bird.fly();
    }

    public static class Animal {

        String name;

        public Animal(String name) {
            this.name = name;
        }

        public void eat() {
            System.out.println("El animal con nombre " + name + " está comiendo.");
        }
    }

    public static class Dog extends Animal {

        int age;

        public Dog(String name, int age) {
            super(name);
            this.age = age;
        }

        @Override
        public void eat() {
            System.out.println("El perro con nombre " + name + " está comiendo.");
        }
    }

    public static class Cat extends Animal {

        public Cat(String name) {
            super(name);
        }
    }

    public static class Bird extends Animal {

        public Bird(String name) {
            super(name);
        }

        public void fly() {
            System.out.println("Está volando");
        }
    }

}

package basic.c08_oop;

/*
Clase 65 - Abstracción
Vídeo: https://youtu.be/JOAqpdM36wI?t=25550
*/

public class Abstraction {

    public static void main(String[] args) {

        // Abstracción

        // - Clase abstracta

        var dog = new Dog();
        dog.sleep();
        dog.sound();

        var cat = new Cat();
        cat.sleep();
        cat.sound();

        // - Interface
    }

    // - Clase abstracta

    public static abstract class Animal {

        public abstract void sound();

        public void sleep() {
            System.out.println("El animal está durmiendo");
        }
    }

    public static class Dog extends Animal {

        @Override
        public void sound() {
            System.out.println("Guau");
        }

        @Override
        public void sleep() {
            System.out.println("El perro está durmiendo");
        }
    }

    public static class Cat extends Animal {

        @Override
        public void sound() {
            System.out.println("Miau");
        }
    }

    // - Interface

    public interface Flying {

        void fly();
    }

    public static class Bird extends Animal implements Flying {

        @Override
        public void sound() {
            System.out.println("Pio pio");
        }

        @Override
        public void fly() {
            System.out.println("El pájaro vuela");
        }
    }

    public static class Bat extends Animal implements Flying {

        @Override
        public void sound() {
            System.out.println("Soy batman!");
        }

        @Override
        public void fly() {
            System.out.println("El murciélago vuela");
        }
    }
}

package basic.c09_exceptions;

/*
Clase 70 - Lanzamiento de excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=28611
*/

public class ThrowExample {

    public void checkAge(int age) throws IllegalArgumentException {
        if (age < 18) {
            throw new IllegalArgumentException("Tienes que ser mayor de edad");
        } else {
            System.out.println("Es mayor de edad");
        }
    }

    public void checkScore(int score) throws CustomException {
        if (score < 0 || score > 100) {
            throw new CustomException("La puntuación debe estar entre 0 y 100");
        } else {
            System.out.println("Puntuación válida: " + score);
        }
    }
}

package basic.c04_conditionals;

/*
Clase 35 - Condicionales
Vídeo: https://youtu.be/JOAqpdM36wI?t=9908
*/

public class Conditionals {

    public static void main(String[] args) {

        // Condicionales

        /*
        Clase 36 - Sentencia if
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9978
        */

        // if, else if, else

        var age = 18;

        System.out.println(age >= 18);

        if (age > 18) {
            System.out.println("El usuario es mayor de edad");
        } else if (age == 18) {
            System.out.println("El usuario acaba de cumplir 18");
        } else {
            System.out.println("El usuario es menor de edad");
        }

        /*
        Clase 37 - Sentencia switch
        Vídeo: https://youtu.be/JOAqpdM36wI?t=10678
        */

        // switch

        var day = 5;

        switch (day) {
            case 1:
                System.out.println("Lunes");
                break;
            case 2:
                System.out.println("Martes");
                break;
            case 3:
                System.out.println("Miércoles");
                break;
            default:
                System.out.println("No es lunes, martes o miércoles");
        }
    }
}

package basic.c08_oop;

/*
Clase 63 - Polimorfismo
Vídeo: https://youtu.be/JOAqpdM36wI?t=24505
*/

public class Polymorphism {

    public static void main(String[] args) {

        // Polimorfismo

        // - Polimorfismo por herencia (sobrescritura)

        var animal = new Animal();
        animal.sound();

        var dog = new Dog();
        dog.sound();

        // - Polimorfismo por sobrecarga (sobrecarga de métodos)

        var calculator = new Calculator();
        System.out.println(calculator.sum(3, 5));
        System.out.println(calculator.sum(3.2, 5.4));
    }

    // - Polimorfismo por herencia (sobrescritura)

    public static class Animal {

        public void sound() {
            System.out.println("Algún sonido");
        }
    }

    public static class Dog extends Animal {

        @Override
        public void sound() {
            System.out.println("Guau");
        }
    }

    // - Polimorfismo por sobrecarga (sobrecarga de métodos)

    public static class Calculator {

        public int sum(int a, int b) {
            return a + b;
        }

        public int sum(int a, int b, int c) {
            return a + b + c;
        }

        public double sum(double a, double b) {
            return a + b;
        }
    }
}

package basic.c08_test_oop;

/*
Clase 59 - Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=21542
*/

import basic.c08_oop.Person;

public class Classes {

    public static void main(String[] args) {

        var person = new Person("Brais", 38, "123456789A");

//        person.name = "Brais";
//        person.age = 38;

        person.sayHello();

//        person.name = "Brais Moure";
//        System.out.println(person.name);
    }
}

package basic.c08_oop;

/*
Clase 57 - Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=19902
*/

public class Person {

    // Atributos
    protected String name;
    private int age;
    final private String id;

    // Constructor
    public Person(String name, int age, String id) {
        this.name = name;
        this.setAge(age);
        this.id = id;
    }

    // Métodos
    public void sayHello() {
        System.out.println("Hola, soy " + name + ", tengo " + age + " años, y mi id es " + id + ".");
    }

    // Getter
    public int getAge() {
        return age;
    }

    public String getId() {
        return id;
    }

    // Setter
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        } else {
            System.out.println("Edad no válida");
        }
    }
}

package basic.c02_operators;

public class Operators {

    public static void main(String[] args) {

        /*
        Clase 18 - Operadores aritméticos
        Vídeo: https://youtu.be/JOAqpdM36wI?t=6803
        */

        // Aritméticos

        var a = 5;
        var b = 3;

        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / b);
        System.out.println(a % b);

        /*
        Clase 19 - Operadores de asignación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7069
        */

        // Asignación

        a = b;
        System.out.println(a);

        a = b * 2;
        System.out.println(a);

        a += 1; // a = a + 1
        System.out.println(a);

        a -= 1;
        System.out.println(a);
        a *= 2;
        System.out.println(a);
        a /= 2;
        System.out.println(a);
        a %= 2;
        System.out.println(a);

        /*
        Clase 20 - Operadores de comparación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7328
        */

        // Comparación (Relacionales)

        System.out.println(a == b);
        System.out.println(a == 0);

        System.out.println(a != b);
        System.out.println(a > b);
        System.out.println(a >= b);
        System.out.println(a < b);
        System.out.println(a <= b);

        /*
        Clase 21 - Operadores lógicos
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7517
        */

        // Lógicos

        // Y (AND)
        System.out.println(true && true);
        System.out.println(true && false);
        System.out.println(false && true);
        System.out.println(false && false);

        System.out.println(3 > 2 && 5 == 2);

        // O (OR)
        System.out.println(true || true);
        System.out.println(true || false);
        System.out.println(false || true);
        System.out.println(false || false);

        System.out.println(3 > 2 || 5 == 2);

        // NO (NOT)
        System.out.println(!true);
        System.out.println(!false);

        System.out.println(!(3 > 2) || 5 == 2);

        /*
        Clase 22 - Operadores unarios
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7863
        */

        // Unarios
        System.out.println(+b);
        System.out.println(-b);
        System.out.println(++b);
        System.out.println(b++);
        System.out.println(b);
        System.out.println(--b);
        System.out.println(b--);
        System.out.println(b);
    }
}

package basic.c08_oop;

/*
Clase 67 - Composición
Vídeo: https://youtu.be/JOAqpdM36wI?t=26963
*/

public class Composition {

    public static void main(String[] args) {

        // Composición ("tiene un")

        var car = new Car();
        car.on();
    }

    public static class Engine {

        public void on() {
            System.out.println("Motor encendido");
        }
    }

    public static class Car {

        final private Engine engine = new Engine();

        public void on() {
            engine.on();
        }
    }
}

package basic.c01_beginner;

/*
Clase 16 - Tipos de datos primitivos
Vídeo: https://youtu.be/JOAqpdM36wI?t=6211
*/

public class DataTypes {

    public static void main(String[] args) {

        // Tipos de datos primitivos

        int myInt = 37;
        System.out.println(myInt);

        double myDouble = 1.77;
        System.out.println(myDouble);

        // float, long, byte

        char myChar = 'a';
        System.out.println(myChar);

        boolean myBoolean = true;
        myBoolean = false;
        System.out.println(myBoolean);

        String myString = "Hola, Java";
        System.out.println(myString);

        // Tipo de dato en tiempo de compilación

        System.out.println(myString.getClass().getSimpleName());
    }
}

package basic.c10_extras;

/*
Clase 74 - Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=30409
*/

public class ExtrasExample {

    public static void main(String[] args) {

        Extras.test();
        System.out.println(Extras.globalName);
    }
}

package basic.c00_helloworld;

/*
Clase 12 - Hola Mundo
Vídeo: https://youtu.be/JOAqpdM36wI?t=4250

Clase 13 - Comentarios
Vídeo: https://youtu.be/JOAqpdM36wI?t=4937
*/

// Hola Mundo

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hola, Java!");
    }
}

package basic.c05_structures;

/*
Clase 44 - Ejercicios: Estructuras
Vídeo: https://youtu.be/JOAqpdM36wI?t=15680
*/

public class StructuresExercises {

    public static void main(String[] args) {

        // 1. Crea un Array con 5 valores e imprime su longitud.

        // 2. Modifica uno de los valores del Array e imprime el valor del índice antes y después de modificarlo.

        // 3. Crea un ArrayList vacío.

        // 4. Añade 4 valores al ArrayList y elimina uno a continuación.

        // 5. Crea un HashSet con 2 valores diferentes.

        // 6. Añade un nuevo valor repetido y otro sin repetir al HashSet.

        // 7. Elimina uno de los elementos del HashSet.

        // 8. Crea un HashMap donde la clave sea un nombre y el valor el número de teléfono. Añade tres contactos.

        // 9. Modifica uno de los contactos y elimina otro.

        // 10. Dado un Array, transfórmalo en un ArrayList, a continuación en un HashSet y finalmente en un HashMap con clave y valor iguales.
    }
}

package basic.c09_exceptions;

/*
Clase 71 - Excepciones personalizadas
Vídeo: https://youtu.be/JOAqpdM36wI?t=29181
*/

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }
}

package basic.c00_helloworld;

/*
Clase 14 - Ejercicios: Primeros pasos
Vídeo: https://youtu.be/JOAqpdM36wI?t=5108
*/

public class HelloWorldExercises {

    public static void main(String[] args) {

        // 1. Imprime un mensaje que diga tu nombre en lugar de "¡Hola Mundo!".

        // 2. Imprime dos líneas: "Hola" y luego "Mundo" con un solo println.

        // 3. Añade un comentario sobre lo que hace cada línea del programa.

        // 4. Crea un comentario en varias líneas.

        // 5. Imprime tu edad, tu color favorito y tu ciudad.

        // 6. Explora los diferentes System.XXX.println(); más allá de "out".

        // 7. Utiliza varios println para imprimir una frase.

        // 8. Imprime un diseño ASCII (por ejemplo, una cara feliz usando símbolos).

        // 9. Intenta ejecutar el programa sin el método main y observa el error.

        //10. Intenta cambiar el nombre del archivo a uno diferente del de la clase y compílalo. ¿Qué pasa?

    }
}

package basic.c06_loops;

/*
Clase 50 - Ejercicios: Bucles
Vídeo: https://youtu.be/JOAqpdM36wI?t=17993
*/

public class LoopsExercises {

    public static void main(String[] args) {

        // 1. Imprime los números del 1 al 10 usando while.

        // 2. Usa do-while para mostrar todos los valores de un ArrayList.

        // 3. Imprime los múltiplos de 5 del 1 al 50 usando for.

        // 4. Recorre un Array de 5 números e imprime la suma total.

        // 5. Usa un for para recorrer un Array y mostrar sus valores.

        // 6. Usa for-each para recorrer un HashSet y un HashMap.

        // 7. Imprime los números del 10 al 1 (descendiente) con un bucle for.

        // 8. Usa continue para saltar los múltiplos de 3 del 1 al 20.

        // 9. Usa break para detener un bucle cuando encuentres un número negativo en un array.

        // 10. Crea un programa que calcule el factorial de un número dado.
    }
}

package basic.c10_extras;

/*
Clase 75 - Ejercicios: Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=31583
*/

public class ExtrasExercises {

    public static void main(String[] args) {

        // 1. Crea una variable de tipo String inicializada como null y verifica que no esté vacía antes de usarla.

        // 2. Escribe un programa que lea el nombre y edad del usuario usando Scanner.

        // 3. Declara una constante final llamada MAX_SCORE con valor 100 y muéstrala.

        // 4. Crea una variable global message y otra local message dentro del método main(). Muestra ambas.

        // 5. Usa import java.util.Scanner; para leer un número y mostrar si es positivo o negativo.

        // 6. Declara una variable static en una clase y accede a ella desde main() sin crear un objeto.

        // 7. Importa java.util.Random y genera un número aleatorio del 1 al 10.

        // 8. Crea una clase con comentarios adecuados explicando cada sección del código.

        // 9. Define una clase User con una constante APP_NAME, una variable global username y una función que imprima ambas.

        // 10. Haz debug del código implementado haciendo uso de sus diferentes herramientas.
    }
}

package basic.c07_functions;

/*
Clase 55 - Ejercicios: Funciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=19521
*/

public class FunctionsExercises {

    public static void main(String[] args) {

        // 1. Crea una función que imprima "¡Te doy la bienvenida al curso de Java desde cero!".

        // 2. Escribe una función que reciba un nombre como parámetro y salude a esa persona.

        // 3. Haz un método que reciba dos números enteros y devuelva su resta.

        // 4. Crea un método que calcule el cuadrado de un número (n * n).

        // 5. Escribe una función que reciba un número y diga si es par o impar.

        // 6. Crea un método que reciba una edad y retorne true si es mayor de edad (y false en caso contrario).

        // 7. Implementa una función que reciba una cadena y retorne su longitud.

        //  8. Crea un método que reciba un array de enteros, calcula su media y lo retorna.

        // 9. Escribe un método que reciba un número y retorna su factorial.

        // 10. Crea una función que reciba un ArrayList<String> y lo recorra mostrando cada elemento.
    }
}

package basic.c08_oop;

/*
Clase 64 - Ejercicios: Polimorfismo
Vídeo: https://youtu.be/JOAqpdM36wI?t=25474
*/

public class PolymorphismExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Animal con el método makeSound(). Luego crea subclases Dog, Cat y Cow que sobrescriban ese método con sonidos diferentes. Llama al método desde una lista de Animal.

        // 2. Crea una clase Shape con el método calculateArea(). Luego implementa subclases Circle y Rectangle con sus propias fórmulas. Usa una lista de Shape para recorrer e imprimir el área de varias figuras.

        // 3. Crea una clase Printer con varios métodos print() sobrecargados que acepten diferentes tipos de parámetros (String, int, double). Llama a cada uno desde main.

        // 4. Crea una clase Greeter con dos métodos greet(): uno que salude con “Hello”, y otro que reciba un nombre y salude con “Hello, [nombre]”.

        // 5. Crea una clase Vehicle con un método start(). Luego crea Car, Bike y Truck que sobrescriban ese método. Recorre una lista ArrayList<Vehicle> para llamar a start() en cada uno.

        // 6. Crea una clase Notification con método send(), y subclases EmailNotification, SMSNotification. Luego crea una función sendNotification(Notification n) que reciba cualquier tipo y lo ejecute.

        // 7. Crea una función showAnimalType(Animal animal) que imprima el tipo de animal. Pasa diferentes subclases (Dog, Cat, Horse) para que cada una imprima su tipo con su propio getType() sobrescrito.

        // 8. Crea una clase Converter con métodos convert(int), convert(double), y convert(String) que devuelvan diferentes formatos de texto.

        // 9. Crea una clase Product con el método getPrice(). Luego, Book y Electronic deben sobrescribirlo con su propia lógica de descuento. Recorre una lista de Product e imprime el precio final de cada uno.

        // 10. Crea una clase Character con método attack(). Luego crea subclases Warrior, Archer, Mage con ataques diferentes. En main, crea un array de Character y llama a attack() para cada uno.
    }
}

package basic.c08_oop;

/*
Clase 60 - Ejercicios: Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=23202
*/

public class AccessModifiersExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Person con atributos privados name y age. Usa los métodos getName(), setName(), getAge() y setAge() para asignar y mostrar valores desde otra clase.

        // 2. Crea una clase Product con el atributo privado price. Añade el método setPrice(double price) que solo permita precios mayores a 0.

        // 3. Crea una clase BankAccount con el atributo privado balance. Implementa los métodos deposit(double amount) y withdraw(double amount) que validen las cantidades correctamente.

        // 4. Crea una clase Book con el atributo privado title. Permite leerlo con el método getTitle() pero no modificarlo (sin setTitle()). El título debe asignarse solo por el constructor.

        // 5. Crea una clase Temperature con el atributo privado celsius. El método setCelsius(double celsius) solo debe aceptar valores entre -100 y 100.

        // 6. Crea una clase User con los atributos privados username y password. Implementa los métodos setUsername(String username), setPassword(String password) y checkPassword(String inputPassword) que compare contraseñas.

        // 7. Crea una clase Employee con el atributo privado salary. Agrega el método raiseSalary(double percent) que solo permita aumentos positivos.

        // 8. Crea una clase Rectangle con los atributos privados width y height. Agrega setters y el método calculateArea() que devuelva el resultado de width * height.

        // 9. Crea una clase Student con el atributo privado grade. Agrega los métodos setGrade(int grade) y isPassed() que retorne true si la nota es mayor o igual a 60.

        // 10. Crea una clase Car con el atributo privado speed. Agrega los métodos accelerate(int amount) que aumente la velocidad (máximo 120) y brake(int amount) que reduzca la velocidad (mínimo 0).
    }
}

package basic.c08_oop;

/*
Clase 62 - Ejercicios: Herencia
Vídeo: https://youtu.be/JOAqpdM36wI?t=24373
*/

public class InheritanceExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Vehicle con un método move(). Luego crea una subclase Car que herede de Vehicle y agrega el método honk().

        // 2. Define una clase Person con los atributos name y age. Luego crea una clase Student que agregue el atributo grade y un método study().

        // 3. Crea una clase Animal con el método makeSound(). Haz que Dog diga “Woof” y Cat diga “Meow” sobrescribiendo ese método.

        // 4. La clase Employee tiene los atributos name y salary. Manager hereda de Employee y agrega el atributo department.

        // 5. Crea una clase abstracta Shape con un método calculateArea(). Luego implementa ese método en Circle y Rectangle.

        // 6. Crea una clase Bird con el método fly(). Luego crea Eagle que sobrescriba fly() pero también llame al método original con super.fly().

        // 7. Haz una clase Device con un constructor que imprima “Device created”. Luego crea Phone que herede de Device y en su constructor imprima “Phone ready”.

        // 8. Account tiene un saldo y métodos para deposit() y withdraw(). SavingsAccount hereda y agrega un método addInterest().

        // 9. Crea una clase Vehicle y tres subclases: Car, Bike y Truck, cada una con un método describe() sobrescrito.

        // 10. Crea un ArrayList<Animal> que contenga instancias de Dog, Cat y Bird. Recorre la lista y llama a makeSound().
    }
}

package basic.c08_oop;

/*
Clase 59 - Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=21542
*/

public class AccessModifiers {

    public static void main(String[] args) {

        // Encapsulamiento

        // - Modificadores de acceso
        // public
        // private
        // protected
        // (default)

        // getters
        // setters

    }
}

package basic.c02_operators;

/*
Clase 23 - Ejercicios: Operadores
Vídeo: https://youtu.be/JOAqpdM36wI?t=8085
*/

public class OperatorsExercises {

    public static void main(String[] args) {

        // 1. Crea una variable con el resultado de cada operación aritmética.

        // 2. Crea una variable para cada tipo de operación de asignación.

        // 3. Imprime 3 comparaciones verdaderas con diferentes operadores de comparación.

        // 4. Imprime 3 comparaciones falsas con diferentes operadores de comparación.

        // 5. Utiliza el operador lógico and.

        // 6. Utiliza el operador lógico or.

        // 7. Combina ambos operadores lógicos.

        // 8. Añade alguna negación.

        // 9. Imprime 3 ejemplos de uso de operadores unarios.

        // 10. Combina operadores aritméticos, de comparación y lógicos.
    }
}

package basic.c09_exceptions;

/*
Clase 72 - Ejercicios: Excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=29721
*/

public class ExceptionsExercises {

    public static void main(String[] args) {

        // 1. Divide dos números almacenados en dos variables. Maneja la división por cero con try-catch.

        // 2. Crea un array de 3 elementos e intenta acceder al índice 5. Captura el ArrayIndexOutOfBoundsException.

        // 3. Crea una variable String nula e intenta imprimir su longitud. Maneja el NullPointerException.

        // 4. Escribe una función que transforma texto a número. Usa try-catch para manejar entradas no válidas (NumberFormatException).

        // 5. Escribe un programa con un bloque finally que se ejecute siempre, haya o no error.

        // 6. Usa throw para lanzar un IllegalArgumentException si un número introducido es negativo.

        // 7. Crea una clase TemperatureChecker que lanza una excepción personalizada si la temperatura es menor a -50 o mayor a 50.

        // 8. Crea un programa con varios bloques catch: uno para ArithmeticException, otro para ArrayIndexOutOfBoundsException.

        // 9. Crea una función checkPassword(String pass) que lance una excepción si la contraseña es demasiado corta.

        // 10. Implementa una clase LoginSystem que use una excepción personalizada LoginFailedException si el usuario o contraseña son incorrectos.
    }
}

package basic.c08_oop;

/*
Clase 58 - Ejercicios: Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=21434
*/

public class ClassesExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Book con atributos title y author. Crea un objeto y muestra sus datos.

        // 2. Crea una clase Dog con un método bark() que imprima su sonido.

        // 3. Añade un constructor a la clase Book que reciba title y author.

        // 4. Crea una clase Car con atributos brand y model y un método showData().

        // 5. Crea una clase Student con atributo score y un método que diga si aprobó (mayor o igual a 60).

        // 6. Crea una clase BankAccount con atributo balance y un método deposit() que sume el saldo.

        // 7. Crea una clase Rectangle con métodos para calcular el área y el perímetro.

        // 8. Crea una clase Worker que reciba nombre y salario, y un método para mostrar su salario.

        // 9. Crea varios objetos Person y guárdalos en un ArrayList.

        // 10. Crea una clase Product y un método que aplique un descuento sobre su precio.
    }
}

package basic.c04_conditionals;

/*
Clase 38 - Ejercicios: Condicionales
Vídeo: https://youtu.be/JOAqpdM36wI?t=11021
*/

public class ConditionalsExercises {

    public static void main(String[] args) {

        // 1. Establece la edad de un usuario y muestra si puede votar (mayor o igual a 18).

        // 2. Declara dos números y muestra cuál es mayor, o si son iguales.

        // 3. Dado un número, verifica si es positivo, negativo o cero.

        // 4. Crea un programa que diga si un número es par o impar.

        // 5. Verifica si un número está en el rango de 1 a 100.

        // 6. Declara una variable con el día de la semana (1-7) y muestra su nombre con switch.

        // 7. Simula un sistema de notas: muestra "Sobresaliente", "Aprobado" o "Suspenso" según la nota (0-100).

        // 8. Escribe un programa que determine si puedes entrar al cine: debes tener al menos 15 años o ir acompañado.

        // 9. Crea un programa que diga si una letra es vocal o consonante.

        // 10. Usa tres variables a, b, c y muestra cuál es el mayor de las tres.

    }
}

package basic.c03_strings;

/*
Clase 34 - Ejercicios: Strings
Vídeo: https://youtu.be/JOAqpdM36wI?t=9838
*/

public class StringsExercises {

    public static void main(String[] args) {

        // 1. Concatena dos cadenas de texto.

        // 2. Muestra la longitud de una cadena de texto.

        // 3. Muestra el primer y último carácter de un string.

        // 4. Convierte a mayúsculas y minúsculas un string.

        // 5. Comprueba si una cadena de texto contiene una palabra concreta.

        // 6. Formatea un string con un entero.

        // 7. Elimina los espacios en blanco al principio y final de un string.

        // 8. Sustituye todos los espacios en blanco de un string por un guión (-).

        // 9. Comprueba si dos strings son iguales.

        // 10. Comprueba si dos strings tienen la misma longitud.
    }
}

package basic.c01_beginner;

/*
Clase 17 - Ejercicios: Variables y constantes
Vídeo: https://youtu.be/JOAqpdM36wI?t=6732
*/

public class BeginnerExercises {

    public static void main(String[] args) {

        // 1. Declara una variable de tipo String y asígnale tu nombre.

        // 2. Crea una variable de tipo int y asígnale tu edad.

        // 3. Crea una variable double con tu altura en metros.

        // 4. Declara una variable de tipo boolean que indique si te gusta programar.

        // 5. Declara una constante con tu email.

        // 6. Crea una variable de tipo char y guárdale tu inicial.

        // 7. Declara una variable de tipo String con tu localidad, y a continuación cambia su valor y vuelve a imprimirla.

        // 8. Crea una variable int llamada a, otra b, e imprime la suma de ambas.

        // 9. Imprime el tipo de dos variables creadas anteriormente.

        // 10. Intenta declarar una variable sin inicializarla y luego asígnale un valor antes de imprimirla.
    }
}

package basic.c08_oop;

/*
Clase 66 - Ejercicios: Abstracción
Vídeo: https://youtu.be/JOAqpdM36wI?t=26892
*/

public class AbstractionExercises {

    public static void main(String[] args) {

        // 1. Crea una clase abstracta Shape con el método calculateArea(). Luego implementa dos subclases: Circle y Rectangle, y haz que cada una calcule su propia área.

        // 2. Crea una interfaz Playable con el método play(). Luego implementa esa interfaz en dos clases: Guitar y Piano. Cada una debe mostrar un mensaje diferente al ejecutarse.

        // 3. Define una clase abstracta Animal con el método makeSound(). Implementa Dog y Cat para que hagan sonidos distintos. Crea un array de Animal para mostrar polimorfismo.

        // 4. Crea una interfaz Drawable. Implementa las clases Circle, Square, y Triangle que muestren cómo se dibuja cada figura usando draw().

        // 5. Crea una clase abstracta Employee con un método calculateSalary(). Implementa FullTimeEmployee y PartTimeEmployee con lógica diferente para calcular el salario.

        // 6. Crea una interfaz Movable con el método move(). Haz que las clases Car y Robot implementen ese método con comportamientos diferentes.

        // 7. Crea una clase abstracta Appliance con método turnOn() y turnOff(). Implementa TV y WashingMachine con mensajes diferentes al encender y apagar.

        // 8. Crea dos interfaces Flyable y Swimmable. Crea una clase Duck que implemente ambas interfaces y muestre cómo puede volar y nadar.

        // 9. Crea una clase abstracta Document con el método print(). Luego crea PDFDocument y WordDocument, cada una con su forma de imprimir.

        // 10. Crea una interfaz Payable con el método pay(). Luego implementa las clases Invoice y EmployeePayment, cada una mostrando un mensaje de pago diferente.
    }
}

This code segment functions to: Demonstrate the manipulation of collections ensuring element uniqueness, including adding and removing entries, checking for presence, and performing set operations such as union, difference, and intersection between groups.

```java
[TASK_BEGIN]
    public static void main(String[] args) {
        // Create a HashSet of Strings
        HashSet<String> dias = new HashSet<>();

        // Add elements (duplicates will be ignored)
        dias.add("Lunes");
        dias.add("Martes");
        dias.add("Miércoles");
        dias.add("Jueves");
        dias.add("Viernes");
        dias.add("Lunes");  // This duplicate won't be added

        // Get set size
        System.out.println("Total elementos: " + dias.size());  // 5

        // Iterate with for-each
        for(String dia : dias) {
            System.out.println(dia);
        }

        // Remove element
        dias.remove("Lunes");
        System.out.println("Contiene Lunes? " + dias.contains("Lunes"));  // false
    }
[TASK_END]
```

public static void main(String[] args) {
        HashSet<String> dias = new HashSet<>();
        dias.add("Lunes");
        dias.add("Martes");
        dias.add("Miércoles");
        dias.add("Jueves");
        dias.add("Viernes");
        dias.add("Lunes");
        System.out.println("Total elementos: " + dias.size());
        for(String dia : dias) {
            System.out.println(dia);
        }
        dias.remove("Lunes");
        System.out.println("Contiene Lunes? " + dias.contains("Lunes"));
    }


package basic.c05_structures;

/*
Clase 43 - Maps
Vídeo: https://youtu.be/JOAqpdM36wI?t=14574
*/

import java.util.HashMap;

public class Maps {

public static void main(String[] args) {
        HashMap<String, String> names = new HashMap<>();
        var numbers = new HashMap<Integer, String>();
        System.out.println(names.size());
        names.put("Brais", "brais@gmail.com");
        names.put("Moure", "moure@gmail.com");
        names.put("MoureDev", "mouredev@gmail.com");
        System.out.println(names.size());
        System.out.println(names);
        System.out.println(names.get("Moure"));
        System.out.println(names.get("Dev"));
        System.out.println(names.containsKey("Moure"));
        System.out.println(names.containsKey("Dev"));
        System.out.println(names.containsValue("moure@gmail.com"));
        System.out.println(names.remove("Moure"));
        System.out.println(names.remove("MoureDev"));
        System.out.println(names);
        names.clear();
        System.out.println(names);
        names.put("Brais", "brais@gmail.com");
        System.out.println(names);
        names.put("Brais", "braismouredev@gmail.com");
        System.out.println(names);
        names.replace("Moure", "mouredev@gmail.com");
        System.out.println(names);
        names.putIfAbsent("Moure", "mouredev@gmail.com");
        System.out.println(names);
        System.out.println(names.isEmpty());
        var values = names.values();
        System.out.println(values);
     }

package basic.c05_structures;

/*
Clase 41 - Listas
Vídeo: https://youtu.be/JOAqpdM36wI?t=12233
*/

import java.util.ArrayList;

public class Lists {

    public static void main(String[] args) {

        // Declaración y creación
        ArrayList<String> names = new ArrayList<>();
        var numbers = new ArrayList<Integer>();

        // Tamaño

        System.out.println(names.size());

        // Inserción

        names.add("Brais");
        names.add("Moure");
        names.add("MoureDev");
        System.out.println(names.size());

        // Acceso

        System.out.println(names.getFirst());
        System.out.println(names.get(1));
        System.out.println(names.getLast());

        // Modificación

        names.set(2, "mouredev@gmail.com");
        System.out.println(names.getLast());

        // Eliminación

        names.remove(2);
        // System.out.println(names.get(2)); // Error
        System.out.println(names.size());

        // Búsqueda

        System.out.println(names.contains("Brais"));
        System.out.println(names.contains("mouredev@gmail.com"));

        // Limpieza

        names.add("Brais");
        System.out.println(names);
        names.clear();
        System.out.println(names.size());

    }
}

package basic.c05_structures;

/*
Clase 42 - Sets
Vídeo: https://youtu.be/JOAqpdM36wI?t=13502
*/

import java.util.HashSet;

public class Sets {

    public static void main(String[] args) {

        // Declaración y creación
        HashSet<String> names = new HashSet<>();
        var numbers = new HashSet<Integer>();

        // Tamaño

        System.out.println(names.size());

        // Inserción

        names.add("Brais");
        names.add("Moure");
        names.add("MoureDev");
        names.add("mouredev@gmail.com");
        System.out.println(names.size());
        System.out.println(names);

        numbers.add(1);
        numbers.add(2);
        numbers.add(3);

        // Eliminación

        names.remove("Brais");
        System.out.println(names.size());

        // Búsqueda

        System.out.println(names.contains("Brais"));
        System.out.println(names.contains("mouredev@gmail.com"));

        System.out.println(names);
        names.add("Moure");
        names.add("Moure");
        names.add("Moure");
        System.out.println(names);

        // Conjuntos

        // names.addAll(numbers); Error

        var countries = new HashSet<String>();
        countries.add("España");
        countries.add("México");
        countries.add("Argentina");
        countries.add("MoureDev");

        names.addAll(countries);
        System.out.println(names);

        names.removeAll(countries);
        System.out.println(names);

        names.retainAll(countries);
        System.out.println(names);
    }
}

package basic.c06_loops;

/*
Clase 45 - Bucles
Vídeo: https://youtu.be/JOAqpdM36wI?t=15862
*/

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class Loops {

    public static void main(String[] args) {

        // Loops

        /*
        Clase 46 - for
        Vídeo: https://youtu.be/JOAqpdM36wI?t=16003
        */

        // - for controlado por contador

        for (int index = 0; index < 5; index++) {
            System.out.println("Hola, Java!");
        }

        String[] names = {"Brais", "Moure", "mouredev"};

        for (int index = 0; index < names.length; index++) {
            System.out.println(names[index]);
        }

        /*
        Clase 47 - forEach
        Vídeo: https://youtu.be/JOAqpdM36wI?t=16646
        */

        // - for-each

        for (String name: names) {
            System.out.println(name);
        }

        HashSet<Integer> numbers = new HashSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        for (Integer number: numbers) {
            System.out.println(number);
        }

        HashMap<String, String> emails = new HashMap<>();
        emails.put("Brais", "brais@gmail.com");
        emails.put("Moure", "moure@gmail.com");
        emails.put("MoureDev", "mouredev@gmail.com");

        for (Map.Entry<String, String> email: emails.entrySet()) {
            System.out.println(email.getKey());
            System.out.println(email.getValue());
        }

        /*
        Clase 48 - while / do while
        Vídeo: https://youtu.be/JOAqpdM36wI?t=17199
        */

        // - while

        int index = 0;
        while (index < 5) {
            System.out.println("Hola, Java!");
            index++;
        }

        index = 0;
        while (index < names.length) {
            System.out.println(names[index]);
            index++;
        }

        index = 0;
        boolean find = false;
        while (!find) {
            System.out.println(names[index]);
            if (names[index].equals("Moure")) {
                find = true;
            }
            index++;
        }

        // - do-while

        index = 0;
        do {
            System.out.println("Hola, Java!");
            index++;
        } while (index < 0);

        /*
        Clase 49 - Control de bucles
        Vídeo: https://youtu.be/JOAqpdM36wI?t=17688
        */

        // Control de bucles

        // - break

        for (String name: names) {
            if (name.equals("Moure")) {
                break;
            }
            System.out.println(name);
        }

        // - continue

        for (int i = 0; i < 5; i++) {
            if (i == 3) {
                continue;
            }
            System.out.println(i);
        }
    }
}

package basic.c05_structures;

/*
Clase 40 - Arrays
Vídeo: https://youtu.be/JOAqpdM36wI?t=11194
*/

public class Arrays {

    public static void main(String[] args) {

        // Declaración y creación
        int[] numbers = new int[3];
        System.out.println(numbers);

        String[] names = {"Brais", "Moure", "mouredev"};
        System.out.println(names);

        // Acceso
        System.out.println(numbers[0]);
        System.out.println(names[0]);

        System.out.println((new String[3])[0]);

        // Modificación
        numbers[0] = 1;
        numbers[1] = 10;
        System.out.println(numbers[0]);
        System.out.println(numbers[1]);

        // numbers[3] = 2; Error

        System.out.println(names[2]);
        names[2] = "mouredev@gmail.com";
        System.out.println(names[2]);

        System.out.println(names.length);
        names[2] = null;
        System.out.println(names[2]);
        System.out.println(names.length);

        // numbers[2] = null; Error

        boolean[] booleans = new boolean[5];
        System.out.println(booleans[4]);
    }
}

package basic.c07_functions;

import java.util.ArrayList;
import java.util.Arrays;

public class Functions {

    public static void main(String[] args) {

        /*
        Clase 51 - Funciones
        Vídeo: https://youtu.be/JOAqpdM36wI?t=186100
        */

        // Funciones

        for (int index = 0; index < 5; index++) {
            sendEmail();
        }

        // ...

        sendEmail();

        sendEmailToUser("brais@gmail.com");
        sendEmailToUser("brais@gmail.com", "Brais");

        var users = new ArrayList<>(Arrays.asList("brais@gmail.com", "moure@gmail.com"));
        sendEmailToUser(users);

        var state = sendEmailWithState("brais@gmail.com");
        System.out.println(state);

        System.out.println(sendEmailWithState(""));
    }

    /*
    Clase 52 - Funciones sin parámetros ni retorno
    Vídeo: https://youtu.be/JOAqpdM36wI?t=18394
    */

    // Función sin parámetros ni retorno

    public static void sendEmail() {
        System.out.println("Se envía el email");
    }

    /*
    Clase 53 - Funciones con parámetros / Sobrecarga
    Vídeo: https://youtu.be/JOAqpdM36wI?t=18827
    */

    // Función con parámetros

    public static void sendEmailToUser(String email) {
        System.out.println("Se envía el email a " + email);
    }

    // Sobrecarga de funciones

    public static void sendEmailToUser(String email, String name) {
        System.out.println("Se envía el email a " + name + " (" + email + ")");
    }

    public static void sendEmailToUser(ArrayList<String> emails) {
        for (String email: emails) {
            sendEmailToUser(email);
        }
    }

    /*
    Clase 54 - Funciones con retorno
    Vídeo: https://youtu.be/JOAqpdM36wI?t=19027
    */

    // Función con retorno

    public static boolean sendEmailWithState(String email) {

        if (email.isEmpty()) {
            return false;
        }

        System.out.println("Se envía el email a " + email);
        return true;
    }
}

package basic.c01_beginner;

/*
Clase 15 - Variables y constantes
Vídeo: https://youtu.be/JOAqpdM36wI?t=5294
*/

public class VariablesAndConstants {

    public static void main(String[] args) {

        // Variables

        String name = "Brais";
        System.out.println(name);

        name = "MoureDev";
        System.out.println(name);

        // name = 37; Error (no podemos cambiar el tipo de dato)

        int age = 37;
        System.out.println(age);

        var email = "mouredev@gmail.com";
        System.out.println(email);

        var year = 2025;
        System.out.println(year);

        // Constantes

        final String EMAIL = "mouredev@gmail.com";
        // EMAIL = "brais@gmail.com"; Es constante
        System.out.println(EMAIL);
    }
}

package basic.c10_extras;

/*
Clase 74 - Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=30409
*/

import basic.c08_oop.Classes;
import basic.c08_oop.Person;

import java.util.Scanner;
//import basic.c08_oop.*;

public class Extras {

    static String globalName = "mouredev";

    public static void main(String[] args) {

        // Extras

        // null

        String name = "Brais";
        name = null;
        if (name != null) {
            System.out.println(name.toLowerCase());
        }

        // import

        new Person("Brais", 18, "1");
        new Classes();

        // Scanner

        var scanner = new Scanner(System.in);

        System.out.println("Introduce tu edad: ");
        var age = scanner.nextInt();

        System.out.println("La edad es: " + age);

        // Scope: variables globales y locales

        test();

        // static
    }

    public static void test() {
        System.out.println(globalName);
    }
}

package basic.c03_strings;

public class Strings {

    public static void main(String[] args) {

        /*
        Clase 24 - Strings
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8140
        */

        // Declaración

        String name = "Brais";
        var surname = new String("Moure");

        // Operaciones básicas

        /*
        Clase 25 - Concatenación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8367
        */

        // Concatenación
        System.out.println(name + " " + surname);

        /*
        Clase 26 - length
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8469
        */

        // Longitud
        System.out.println(name.length());

        /*
        Clase 27 - charAt
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8535
        */

        // Obtener carácter
        System.out.println(name.charAt(name.length() - 1));

        /*
        Clase 28 - substring
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8707
        */

        // Subcadena
        System.out.println(name.substring(2));
        System.out.println(name.substring(1, 3));

        /*
        Clase 29 - toUpperCase / toLowerCase
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8831
        */

        // Mayúsculas y minúsculas
        System.out.println(name.toUpperCase());
        System.out.println(name.toLowerCase());

        System.out.println(name);

        /*
        Clase 30 - contains
        Vídeo: https://youtu.be/JOAqpdM36wI?t=8947
        */

        // Comprobar si contiene
        System.out.println("Hola, Java".contains("Brais"));
        System.out.println("Hola, Java".toUpperCase().contains("AVA"));

        /*
        Clase 31 - equals
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9118
        */

        // Comparación
        System.out.println(name.equals("Brais"));
        System.out.println(name.equals("brais"));
        System.out.println(name.equalsIgnoreCase("brais"));

        // == vs. equals

        var a = "Brais";
        var b = "Brais";
        var c = new String("Brais");

        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(a.equals(c));

        /*
        Clase 32 - trim y replace
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9456
        */

        // Trim
        System.out.println(" Hola, me llamo Brais ".trim());

        // Replace
        System.out.println(" Hola, me llamo Brais ".replace("Brais", "Moure"));

        /*
        Clase 33 - format
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9613
        */

        // Format
        var age = 37;
        System.out.println(String.format("Hola, %s. Tengo %d.", name, age));
    }
}

package basic.c08_oop;

/*
Clase 57 - Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=19902
*/

public class Classes {

    public static void main(String[] args) {

        var person = new Person("Brais", -38, "123456789A");

//        person.name = "Brais";
//        person.age = 38;

        person.sayHello();

        person.name = "Brais Moure";
        System.out.println(person.name);

//        person.id = "123456789A";

        System.out.println(person.getId());

        person.setAge(38);
        System.out.println(person.getAge());

        var person2 = new Person("MoureDev", 18, "123456789B");
        person2.sayHello();
    }
}

package basic.c09_exceptions;

/*
Clase 69 - Excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=27930
*/

public class Exceptions {

    public static void main(String[] args) {

        // Manejo de excepciones

        // try catch
        try {
            var result = 10 / 0;
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e);
        }

        // try con múltiples catch
        try {
            var result = 10 / 5;
            System.out.println(result);

            var name = "Brais";
            name = null;
            System.out.println("Name: " + name.toUpperCase());
        } catch (ArithmeticException e) {
            System.out.println("Cuidado con dividir algo que no puedes: " + e);
        } catch (NullPointerException e) {
            System.out.println("Ha ocurrido un null pointer mítico!");
        } catch (Exception e) {
            System.out.println("Se ha producido un error no esperado");
        }

        // finally
        try {
            var result = 10 / 0;
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e);
        } finally {
            System.out.println("Fin del bloque try-catch");
        }

        // throw
        var throwExample = new ThrowExample();
        try {
            throwExample.checkAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println("Error revisando la edad: " + e.getMessage());
        }

        // Excepción personalizada
        try {
            throwExample.checkScore(450);
        } catch (CustomException e) {
            System.out.println("Error revisando la puntuación: "+ e.getMessage());
        }

        System.out.println("Fin");
    }
}

package basic.c08_oop;

/*
Clase 61 - Herencia
Vídeo: https://youtu.be/JOAqpdM36wI?t=23334
*/

public class Inheritance {

    public static void main(String[] args) {

        // Herencia ("es un")

        var animal = new Animal("Mi animal");
//        animal.name = "Mi animal";
        animal.eat();

        var dog = new Dog("Mou", 3);
//        dog.name = "Mou";
        dog.eat();

        var cat = new Cat("Cou");
//        cat.name = "Cou";
        cat.eat();

        var bird = new Bird("Bou");
//        bird.name = "Bou";
        bird.eat();
        bird.fly();
    }

    public static class Animal {

        String name;

        public Animal(String name) {
            this.name = name;
        }

        public void eat() {
            System.out.println("El animal con nombre " + name + " está comiendo.");
        }
    }

    public static class Dog extends Animal {

        int age;

        public Dog(String name, int age) {
            super(name);
            this.age = age;
        }

        @Override
        public void eat() {
            System.out.println("El perro con nombre " + name + " está comiendo.");
        }
    }

    public static class Cat extends Animal {

        public Cat(String name) {
            super(name);
        }
    }

    public static class Bird extends Animal {

        public Bird(String name) {
            super(name);
        }

        public void fly() {
            System.out.println("Está volando");
        }
    }

}

package basic.c08_test_oop;

/*
Clase 59 - Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=21542
*/

import basic.c08_oop.Person;

public class Classes {

    public static void main(String[] args) {

        var person = new Person("Brais", 38, "123456789A");

//        person.name = "Brais";
//        person.age = 38;

        person.sayHello();

//        person.name = "Brais Moure";
//        System.out.println(person.name);
    }
}

package basic.c08_oop;

/*
Clase 65 - Abstracción
Vídeo: https://youtu.be/JOAqpdM36wI?t=25550
*/

public class Abstraction {

    public static void main(String[] args) {

        // Abstracción

        // - Clase abstracta

        var dog = new Dog();
        dog.sleep();
        dog.sound();

        var cat = new Cat();
        cat.sleep();
        cat.sound();

        // - Interface
    }

    // - Clase abstracta

    public static abstract class Animal {

        public abstract void sound();

        public void sleep() {
            System.out.println("El animal está durmiendo");
        }
    }

    public static class Dog extends Animal {

        @Override
        public void sound() {
            System.out.println("Guau");
        }

        @Override
        public void sleep() {
            System.out.println("El perro está durmiendo");
        }
    }

    public static class Cat extends Animal {

        @Override
        public void sound() {
            System.out.println("Miau");
        }
    }

    // - Interface

    public interface Flying {

        void fly();
    }

    public static class Bird extends Animal implements Flying {

        @Override
        public void sound() {
            System.out.println("Pio pio");
        }

        @Override
        public void fly() {
            System.out.println("El pájaro vuela");
        }
    }

    public static class Bat extends Animal implements Flying {

        @Override
        public void sound() {
            System.out.println("Soy batman!");
        }

        @Override
        public void fly() {
            System.out.println("El murciélago vuela");
        }
    }
}

package basic.c04_conditionals;

/*
Clase 35 - Condicionales
Vídeo: https://youtu.be/JOAqpdM36wI?t=9908
*/

public class Conditionals {

    public static void main(String[] args) {

        // Condicionales

        /*
        Clase 36 - Sentencia if
        Vídeo: https://youtu.be/JOAqpdM36wI?t=9978
        */

        // if, else if, else

        var age = 18;

        System.out.println(age >= 18);

        if (age > 18) {
            System.out.println("El usuario es mayor de edad");
        } else if (age == 18) {
            System.out.println("El usuario acaba de cumplir 18");
        } else {
            System.out.println("El usuario es menor de edad");
        }

        /*
        Clase 37 - Sentencia switch
        Vídeo: https://youtu.be/JOAqpdM36wI?t=10678
        */

        // switch

        var day = 5;

        switch (day) {
            case 1:
                System.out.println("Lunes");
                break;
            case 2:
                System.out.println("Martes");
                break;
            case 3:
                System.out.println("Miércoles");
                break;
            default:
                System.out.println("No es lunes, martes o miércoles");
        }
    }
}

package basic.c09_exceptions;

/*
Clase 70 - Lanzamiento de excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=28611
*/

public class ThrowExample {

    public void checkAge(int age) throws IllegalArgumentException {
        if (age < 18) {
            throw new IllegalArgumentException("Tienes que ser mayor de edad");
        } else {
            System.out.println("Es mayor de edad");
        }
    }

    public void checkScore(int score) throws CustomException {
        if (score < 0 || score > 100) {
            throw new CustomException("La puntuación debe estar entre 0 y 100");
        } else {
            System.out.println("Puntuación válida: " + score);
        }
    }
}

package basic.c08_oop;

/*
Clase 57 - Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=19902
*/

public class Person {

    // Atributos
    protected String name;
    private int age;
    final private String id;

    // Constructor
    public Person(String name, int age, String id) {
        this.name = name;
        this.setAge(age);
        this.id = id;
    }

    // Métodos
    public void sayHello() {
        System.out.println("Hola, soy " + name + ", tengo " + age + " años, y mi id es " + id + ".");
    }

    // Getter
    public int getAge() {
        return age;
    }

    public String getId() {
        return id;
    }

    // Setter
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        } else {
            System.out.println("Edad no válida");
        }
    }
}

package basic.c08_oop;

/*
Clase 63 - Polimorfismo
Vídeo: https://youtu.be/JOAqpdM36wI?t=24505
*/

public class Polymorphism {

    public static void main(String[] args) {

        // Polimorfismo

        // - Polimorfismo por herencia (sobrescritura)

        var animal = new Animal();
        animal.sound();

        var dog = new Dog();
        dog.sound();

        // - Polimorfismo por sobrecarga (sobrecarga de métodos)

        var calculator = new Calculator();
        System.out.println(calculator.sum(3, 5));
        System.out.println(calculator.sum(3.2, 5.4));
    }

    // - Polimorfismo por herencia (sobrescritura)

    public static class Animal {

        public void sound() {
            System.out.println("Algún sonido");
        }
    }

    public static class Dog extends Animal {

        @Override
        public void sound() {
            System.out.println("Guau");
        }
    }

    // - Polimorfismo por sobrecarga (sobrecarga de métodos)

    public static class Calculator {

        public int sum(int a, int b) {
            return a + b;
        }

        public int sum(int a, int b, int c) {
            return a + b + c;
        }

        public double sum(double a, double b) {
            return a + b;
        }
    }
}

package basic.c02_operators;

public class Operators {

    public static void main(String[] args) {

        /*
        Clase 18 - Operadores aritméticos
        Vídeo: https://youtu.be/JOAqpdM36wI?t=6803
        */

        // Aritméticos

        var a = 5;
        var b = 3;

        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / b);
        System.out.println(a % b);

        /*
        Clase 19 - Operadores de asignación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7069
        */

        // Asignación

        a = b;
        System.out.println(a);

        a = b * 2;
        System.out.println(a);

        a += 1; // a = a + 1
        System.out.println(a);

        a -= 1;
        System.out.println(a);
        a *= 2;
        System.out.println(a);
        a /= 2;
        System.out.println(a);
        a %= 2;
        System.out.println(a);

        /*
        Clase 20 - Operadores de comparación
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7328
        */

        // Comparación (Relacionales)

        System.out.println(a == b);
        System.out.println(a == 0);

        System.out.println(a != b);
        System.out.println(a > b);
        System.out.println(a >= b);
        System.out.println(a < b);
        System.out.println(a <= b);

        /*
        Clase 21 - Operadores lógicos
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7517
        */

        // Lógicos

        // Y (AND)
        System.out.println(true && true);
        System.out.println(true && false);
        System.out.println(false && true);
        System.out.println(false && false);

        System.out.println(3 > 2 && 5 == 2);

        // O (OR)
        System.out.println(true || true);
        System.out.println(true || false);
        System.out.println(false || true);
        System.out.println(false || false);

        System.out.println(3 > 2 || 5 == 2);

        // NO (NOT)
        System.out.println(!true);
        System.out.println(!false);

        System.out.println(!(3 > 2) || 5 == 2);

        /*
        Clase 22 - Operadores unarios
        Vídeo: https://youtu.be/JOAqpdM36wI?t=7863
        */

        // Unarios
        System.out.println(+b);
        System.out.println(-b);
        System.out.println(++b);
        System.out.println(b++);
        System.out.println(b);
        System.out.println(--b);
        System.out.println(b--);
        System.out.println(b);
    }
}

package basic.c01_beginner;

/*
Clase 16 - Tipos de datos primitivos
Vídeo: https://youtu.be/JOAqpdM36wI?t=6211
*/

public class DataTypes {

    public static void main(String[] args) {

        // Tipos de datos primitivos

        int myInt = 37;
        System.out.println(myInt);

        double myDouble = 1.77;
        System.out.println(myDouble);

        // float, long, byte

        char myChar = 'a';
        System.out.println(myChar);

        boolean myBoolean = true;
        myBoolean = false;
        System.out.println(myBoolean);

        String myString = "Hola, Java";
        System.out.println(myString);

        // Tipo de dato en tiempo de compilación

        System.out.println(myString.getClass().getSimpleName());
    }
}

package basic.c08_oop;

/*
Clase 67 - Composición
Vídeo: https://youtu.be/JOAqpdM36wI?t=26963
*/

public class Composition {

    public static void main(String[] args) {

        // Composición ("tiene un")

        var car = new Car();
        car.on();
    }

    public static class Engine {

        public void on() {
            System.out.println("Motor encendido");
        }
    }

    public static class Car {

        final private Engine engine = new Engine();

        public void on() {
            engine.on();
        }
    }
}

package basic.c00_helloworld;

/*
Clase 12 - Hola Mundo
Vídeo: https://youtu.be/JOAqpdM36wI?t=4250

Clase 13 - Comentarios
Vídeo: https://youtu.be/JOAqpdM36wI?t=4937
*/

// Hola Mundo

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hola, Java!");
    }
}

package basic.c10_extras;

/*
Clase 74 - Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=30409
*/

public class ExtrasExample {

    public static void main(String[] args) {

        Extras.test();
        System.out.println(Extras.globalName);
    }
}

package basic.c00_helloworld;

/*
Clase 14 - Ejercicios: Primeros pasos
Vídeo: https://youtu.be/JOAqpdM36wI?t=5108
*/

public class HelloWorldExercises {

    public static void main(String[] args) {

        // 1. Imprime un mensaje que diga tu nombre en lugar de "¡Hola Mundo!".

        // 2. Imprime dos líneas: "Hola" y luego "Mundo" con un solo println.

        // 3. Añade un comentario sobre lo que hace cada línea del programa.

        // 4. Crea un comentario en varias líneas.

        // 5. Imprime tu edad, tu color favorito y tu ciudad.

        // 6. Explora los diferentes System.XXX.println(); más allá de "out".

        // 7. Utiliza varios println para imprimir una frase.

        // 8. Imprime un diseño ASCII (por ejemplo, una cara feliz usando símbolos).

        // 9. Intenta ejecutar el programa sin el método main y observa el error.

        //10. Intenta cambiar el nombre del archivo a uno diferente del de la clase y compílalo. ¿Qué pasa?

    }
}

package basic.c04_conditionals;

/*
Clase 38 - Ejercicios: Condicionales
Vídeo: https://youtu.be/JOAqpdM36wI?t=11021
*/

public class ConditionalsExercises {

    public static void main(String[] args) {

        // 1. Establece la edad de un usuario y muestra si puede votar (mayor o igual a 18).

        // 2. Declara dos números y muestra cuál es mayor, o si son iguales.

        // 3. Dado un número, verifica si es positivo, negativo o cero.

        // 4. Crea un programa que diga si un número es par o impar.

        // 5. Verifica si un número está en el rango de 1 a 100.

        // 6. Declara una variable con el día de la semana (1-7) y muestra su nombre con switch.

        // 7. Simula un sistema de notas: muestra "Sobresaliente", "Aprobado" o "Suspenso" según la nota (0-100).

        // 8. Escribe un programa que determine si puedes entrar al cine: debes tener al menos 15 años o ir acompañado.

        // 9. Crea un programa que diga si una letra es vocal o consonante.

        // 10. Usa tres variables a, b, c y muestra cuál es el mayor de las tres.

    }
}

package basic.c05_structures;

/*
Clase 44 - Ejercicios: Estructuras
Vídeo: https://youtu.be/JOAqpdM36wI?t=15680
*/

public class StructuresExercises {

    public static void main(String[] args) {

        // 1. Crea un Array con 5 valores e imprime su longitud.

        // 2. Modifica uno de los valores del Array e imprime el valor del índice antes y después de modificarlo.

        // 3. Crea un ArrayList vacío.

        // 4. Añade 4 valores al ArrayList y elimina uno a continuación.

        // 5. Crea un HashSet con 2 valores diferentes.

        // 6. Añade un nuevo valor repetido y otro sin repetir al HashSet.

        // 7. Elimina uno de los elementos del HashSet.

        // 8. Crea un HashMap donde la clave sea un nombre y el valor el número de teléfono. Añade tres contactos.

        // 9. Modifica uno de los contactos y elimina otro.

        // 10. Dado un Array, transfórmalo en un ArrayList, a continuación en un HashSet y finalmente en un HashMap con clave y valor iguales.
    }
}

package basic.c09_exceptions;

/*
Clase 71 - Excepciones personalizadas
Vídeo: https://youtu.be/JOAqpdM36wI?t=29181
*/

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }
}

package basic.c07_functions;

/*
Clase 55 - Ejercicios: Funciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=19521
*/

public class FunctionsExercises {

    public static void main(String[] args) {

        // 1. Crea una función que imprima "¡Te doy la bienvenida al curso de Java desde cero!".

        // 2. Escribe una función que reciba un nombre como parámetro y salude a esa persona.

        // 3. Haz un método que reciba dos números enteros y devuelva su resta.

        // 4. Crea un método que calcule el cuadrado de un número (n * n).

        // 5. Escribe una función que reciba un número y diga si es par o impar.

        // 6. Crea un método que reciba una edad y retorne true si es mayor de edad (y false en caso contrario).

        // 7. Implementa una función que reciba una cadena y retorne su longitud.

        //  8. Crea un método que reciba un array de enteros, calcula su media y lo retorna.

        // 9. Escribe un método que reciba un número y retorna su factorial.

        // 10. Crea una función que reciba un ArrayList<String> y lo recorra mostrando cada elemento.
    }
}

package basic.c10_extras;

/*
Clase 75 - Ejercicios: Extras
Vídeo: https://youtu.be/JOAqpdM36wI?t=31583
*/

public class ExtrasExercises {

    public static void main(String[] args) {

        // 1. Crea una variable de tipo String inicializada como null y verifica que no esté vacía antes de usarla.

        // 2. Escribe un programa que lea el nombre y edad del usuario usando Scanner.

        // 3. Declara una constante final llamada MAX_SCORE con valor 100 y muéstrala.

        // 4. Crea una variable global message y otra local message dentro del método main(). Muestra ambas.

        // 5. Usa import java.util.Scanner; para leer un número y mostrar si es positivo o negativo.

        // 6. Declara una variable static en una clase y accede a ella desde main() sin crear un objeto.

        // 7. Importa java.util.Random y genera un número aleatorio del 1 al 10.

        // 8. Crea una clase con comentarios adecuados explicando cada sección del código.

        // 9. Define una clase User con una constante APP_NAME, una variable global username y una función que imprima ambas.

        // 10. Haz debug del código implementado haciendo uso de sus diferentes herramientas.
    }
}

package basic.c08_oop;

/*
Clase 60 - Ejercicios: Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=23202
*/

public class AccessModifiersExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Person con atributos privados name y age. Usa los métodos getName(), setName(), getAge() y setAge() para asignar y mostrar valores desde otra clase.

        // 2. Crea una clase Product con el atributo privado price. Añade el método setPrice(double price) que solo permita precios mayores a 0.

        // 3. Crea una clase BankAccount con el atributo privado balance. Implementa los métodos deposit(double amount) y withdraw(double amount) que validen las cantidades correctamente.

        // 4. Crea una clase Book con el atributo privado title. Permite leerlo con el método getTitle() pero no modificarlo (sin setTitle()). El título debe asignarse solo por el constructor.

        // 5. Crea una clase Temperature con el atributo privado celsius. El método setCelsius(double celsius) solo debe aceptar valores entre -100 y 100.

        // 6. Crea una clase User con los atributos privados username y password. Implementa los métodos setUsername(String username), setPassword(String password) y checkPassword(String inputPassword) que compare contraseñas.

        // 7. Crea una clase Employee con el atributo privado salary. Agrega el método raiseSalary(double percent) que solo permita aumentos positivos.

        // 8. Crea una clase Rectangle con los atributos privados width y height. Agrega setters y el método calculateArea() que devuelva el resultado de width * height.

        // 9. Crea una clase Student con el atributo privado grade. Agrega los métodos setGrade(int grade) y isPassed() que retorne true si la nota es mayor o igual a 60.

        // 10. Crea una clase Car con el atributo privado speed. Agrega los métodos accelerate(int amount) que aumente la velocidad (máximo 120) y brake(int amount) que reduzca la velocidad (mínimo 0).
    }
}

package basic.c06_loops;

/*
Clase 50 - Ejercicios: Bucles
Vídeo: https://youtu.be/JOAqpdM36wI?t=17993
*/

public class LoopsExercises {

    public static void main(String[] args) {

        // 1. Imprime los números del 1 al 10 usando while.

        // 2. Usa do-while para mostrar todos los valores de un ArrayList.

        // 3. Imprime los múltiplos de 5 del 1 al 50 usando for.

        // 4. Recorre un Array de 5 números e imprime la suma total.

        // 5. Usa un for para recorrer un Array y mostrar sus valores.

        // 6. Usa for-each para recorrer un HashSet y un HashMap.

        // 7. Imprime los números del 10 al 1 (descendiente) con un bucle for.

        // 8. Usa continue para saltar los múltiplos de 3 del 1 al 20.

        // 9. Usa break para detener un bucle cuando encuentres un número negativo en un array.

        // 10. Crea un programa que calcule el factorial de un número dado.
    }
}

package basic.c01_beginner;

/*
Clase 17 - Ejercicios: Variables y constantes
Vídeo: https://youtu.be/JOAqpdM36wI?t=6732
*/

public class BeginnerExercises {

    public static void main(String[] args) {

        // 1. Declara una variable de tipo String y asígnale tu nombre.

        // 2. Crea una variable de tipo int y asígnale tu edad.

        // 3. Crea una variable double con tu altura en metros.

        // 4. Declara una variable de tipo boolean que indique si te gusta programar.

        // 5. Declara una constante con tu email.

        // 6. Crea una variable de tipo char y guárdale tu inicial.

        // 7. Declara una variable de tipo String con tu localidad, y a continuación cambia su valor y vuelve a imprimirla.

        // 8. Crea una variable int llamada a, otra b, e imprime la suma de ambas.

        // 9. Imprime el tipo de dos variables creadas anteriormente.

        // 10. Intenta declarar una variable sin inicializarla y luego asígnale un valor antes de imprimirla.
    }
}

package basic.c09_exceptions;

/*
Clase 72 - Ejercicios: Excepciones
Vídeo: https://youtu.be/JOAqpdM36wI?t=29721
*/

public class ExceptionsExercises {

    public static void main(String[] args) {

        // 1. Divide dos números almacenados en dos variables. Maneja la división por cero con try-catch.

        // 2. Crea un array de 3 elementos e intenta acceder al índice 5. Captura el ArrayIndexOutOfBoundsException.

        // 3. Crea una variable String nula e intenta imprimir su longitud. Maneja el NullPointerException.

        // 4. Escribe una función que transforma texto a número. Usa try-catch para manejar entradas no válidas (NumberFormatException).

        // 5. Escribe un programa con un bloque finally que se ejecute siempre, haya o no error.

        // 6. Usa throw para lanzar un IllegalArgumentException si un número introducido es negativo.

        // 7. Crea una clase TemperatureChecker que lanza una excepción personalizada si la temperatura es menor a -50 o mayor a 50.

        // 8. Crea un programa con varios bloques catch: uno para ArithmeticException, otro para ArrayIndexOutOfBoundsException.

        // 9. Crea una función checkPassword(String pass) que lance una excepción si la contraseña es demasiado corta.

        // 10. Implementa una clase LoginSystem que use una excepción personalizada LoginFailedException si el usuario o contraseña son incorrectos.
    }
}

package basic.c08_oop;

/*
Clase 64 - Ejercicios: Polimorfismo
Vídeo: https://youtu.be/JOAqpdM36wI?t=25474
*/

public class PolymorphismExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Animal con el método makeSound(). Luego crea subclases Dog, Cat y Cow que sobrescriban ese método con sonidos diferentes. Llama al método desde una lista de Animal.

        // 2. Crea una clase Shape con el método calculateArea(). Luego implementa subclases Circle y Rectangle con sus propias fórmulas. Usa una lista de Shape para recorrer e imprimir el área de varias figuras.

        // 3. Crea una clase Printer con varios métodos print() sobrecargados que acepten diferentes tipos de parámetros (String, int, double). Llama a cada uno desde main.

        // 4. Crea una clase Greeter con dos métodos greet(): uno que salude con “Hello”, y otro que reciba un nombre y salude con “Hello, [nombre]”.

        // 5. Crea una clase Vehicle con un método start(). Luego crea Car, Bike y Truck que sobrescriban ese método. Recorre una lista ArrayList<Vehicle> para llamar a start() en cada uno.

        // 6. Crea una clase Notification con método send(), y subclases EmailNotification, SMSNotification. Luego crea una función sendNotification(Notification n) que reciba cualquier tipo y lo ejecute.

        // 7. Crea una función showAnimalType(Animal animal) que imprima el tipo de animal. Pasa diferentes subclases (Dog, Cat, Horse) para que cada una imprima su tipo con su propio getType() sobrescrito.

        // 8. Crea una clase Converter con métodos convert(int), convert(double), y convert(String) que devuelvan diferentes formatos de texto.

        // 9. Crea una clase Product con el método getPrice(). Luego, Book y Electronic deben sobrescribirlo con su propia lógica de descuento. Recorre una lista de Product e imprime el precio final de cada uno.

        // 10. Crea una clase Character con método attack(). Luego crea subclases Warrior, Archer, Mage con ataques diferentes. En main, crea un array de Character y llama a attack() para cada uno.
    }
}

package basic.c08_oop;

/*
Clase 62 - Ejercicios: Herencia
Vídeo: https://youtu.be/JOAqpdM36wI?t=24373
*/

public class InheritanceExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Vehicle con un método move(). Luego crea una subclase Car que herede de Vehicle y agrega el método honk().

        // 2. Define una clase Person con los atributos name y age. Luego crea una clase Student que agregue el atributo grade y un método study().

        // 3. Crea una clase Animal con el método makeSound(). Haz que Dog diga “Woof” y Cat diga “Meow” sobrescribiendo ese método.

        // 4. La clase Employee tiene los atributos name y salary. Manager hereda de Employee y agrega el atributo department.

        // 5. Crea una clase abstracta Shape con un método calculateArea(). Luego implementa ese método en Circle y Rectangle.

        // 6. Crea una clase Bird con el método fly(). Luego crea Eagle que sobrescriba fly() pero también llame al método original con super.fly().

        // 7. Haz una clase Device con un constructor que imprima “Device created”. Luego crea Phone que herede de Device y en su constructor imprima “Phone ready”.

        // 8. Account tiene un saldo y métodos para deposit() y withdraw(). SavingsAccount hereda y agrega un método addInterest().

        // 9. Crea una clase Vehicle y tres subclases: Car, Bike y Truck, cada una con un método describe() sobrescrito.

        // 10. Crea un ArrayList<Animal> que contenga instancias de Dog, Cat y Bird. Recorre la lista y llama a makeSound().
    }
}

package basic.c08_oop;

/*
Clase 58 - Ejercicios: Clases y objetos
Vídeo: https://youtu.be/JOAqpdM36wI?t=21434
*/

public class ClassesExercises {

    public static void main(String[] args) {

        // 1. Crea una clase Book con atributos title y author. Crea un objeto y muestra sus datos.

        // 2. Crea una clase Dog con un método bark() que imprima su sonido.

        // 3. Añade un constructor a la clase Book que reciba title y author.

        // 4. Crea una clase Car con atributos brand y model y un método showData().

        // 5. Crea una clase Student con atributo score y un método que diga si aprobó (mayor o igual a 60).

        // 6. Crea una clase BankAccount con atributo balance y un método deposit() que sume el saldo.

        // 7. Crea una clase Rectangle con métodos para calcular el área y el perímetro.

        // 8. Crea una clase Worker que reciba nombre y salario, y un método para mostrar su salario.

        // 9. Crea varios objetos Person y guárdalos en un ArrayList.

        // 10. Crea una clase Product y un método que aplique un descuento sobre su precio.
    }
}

package basic.c02_operators;

/*
Clase 23 - Ejercicios: Operadores
Vídeo: https://youtu.be/JOAqpdM36wI?t=8085
*/

public class OperatorsExercises {

    public static void main(String[] args) {

        // 1. Crea una variable con el resultado de cada operación aritmética.

        // 2. Crea una variable para cada tipo de operación de asignación.

        // 3. Imprime 3 comparaciones verdaderas con diferentes operadores de comparación.

        // 4. Imprime 3 comparaciones falsas con diferentes operadores de comparación.

        // 5. Utiliza el operador lógico and.

        // 6. Utiliza el operador lógico or.

        // 7. Combina ambos operadores lógicos.

        // 8. Añade alguna negación.

        // 9. Imprime 3 ejemplos de uso de operadores unarios.

        // 10. Combina operadores aritméticos, de comparación y lógicos.
    }
}

package basic.c08_oop;

/*
Clase 66 - Ejercicios: Abstracción
Vídeo: https://youtu.be/JOAqpdM36wI?t=26892
*/

public class AbstractionExercises {

    public static void main(String[] args) {

        // 1. Crea una clase abstracta Shape con el método calculateArea(). Luego implementa dos subclases: Circle y Rectangle, y haz que cada una calcule su propia área.

        // 2. Crea una interfaz Playable con el método play(). Luego implementa esa interfaz en dos clases: Guitar y Piano. Cada una debe mostrar un mensaje diferente al ejecutarse.

        // 3. Define una clase abstracta Animal con el método makeSound(). Implementa Dog y Cat para que hagan sonidos distintos. Crea un array de Animal para mostrar polimorfismo.

        // 4. Crea una interfaz Drawable. Implementa las clases Circle, Square, y Triangle que muestren cómo se dibuja cada figura usando draw().

        // 5. Crea una clase abstracta Employee con un método calculateSalary(). Implementa FullTimeEmployee y PartTimeEmployee con lógica diferente para calcular el salario.

        // 6. Crea una interfaz Movable con el método move(). Haz que las clases Car y Robot implementen ese método con comportamientos diferentes.

        // 7. Crea una clase abstracta Appliance con método turnOn() y turnOff(). Implementa TV y WashingMachine con mensajes diferentes al encender y apagar.

        // 8. Crea dos interfaces Flyable y Swimmable. Crea una clase Duck que implemente ambas interfaces y muestre cómo puede volar y nadar.

        // 9. Crea una clase abstracta Document con el método print(). Luego crea PDFDocument y WordDocument, cada una con su forma de imprimir.

        // 10. Crea una interfaz Payable con el método pay(). Luego implementa las clases Invoice y EmployeePayment, cada una mostrando un mensaje de pago diferente.
    }
}

package basic.c08_oop;

/*
Clase 59 - Modificadores de acceso
Vídeo: https://youtu.be/JOAqpdM36wI?t=21542
*/

public class AccessModifiers {

    public static void main(String[] args) {

        // Encapsulamiento

        // - Modificadores de acceso
        // public
        // private
        // protected
        // (default)

        // getters
        // setters

    }
}

package basic.c03_strings;

/*
Clase 34 - Ejercicios: Strings
Vídeo: https://youtu.be/JOAqpdM36wI?t=9838
*/

public class StringsExercises {

    public static void main(String[] args) {

        // 1. Concatena dos cadenas de texto.

        // 2. Muestra la longitud de una cadena de texto.

        // 3. Muestra el primer y último carácter de un string.

        // 4. Convierte a mayúsculas y minúsculas un string.

        // 5. Comprueba si una cadena de texto contiene una palabra concreta.

        // 6. Formatea un string con un entero.

        // 7. Elimina los espacios en blanco al principio y final de un string.

        // 8. Sustituye todos los espacios en blanco de un string por un guión (-).

        // 9. Comprueba si dos strings son iguales.

        // 10. Comprueba si dos strings tienen la misma longitud.
    }
}

public static void main (String[] args) {}

This code segment functions to: Demonstrate the manipulation of a key-value storage structure by adding new entries, retrieving stored values, checking for entry existence, removing individual entries, clearing all entries, replacing existing entries, conditionally adding entries, checking if empty, and accessing all stored values.

```java
[TASK_BEGIN]
    public static void main(String[] args) {
        HashMap<String, Integer> edades = new HashMap<>();

        // Agregar elementos
        edades.put("Juan", 30);
        edades.put("Maria", 25);
        edades.put("Carlos", 40);

        // Obtener valor
        System.out.println("Edad de Maria: " + edades.get("Maria"));

        // Verificar existencia
        System.out.println("¿Existe Pedro? " + edades.containsKey("Pedro"));

        // Eliminar elemento
        edades.remove("Carlos");
        System.out.println("Tamaño del mapa: " + edades.size());

        // Iterar el mapa
        for(HashMap.Entry<String, Integer> entrada : edades.entrySet()) {
            System.out.println(entrada.getKey() + " -> " + entrada.getValue());
        }
    }
[TASK_END]
```

public static void main(String[] args) {
        HashMap<String, Integer> edades = new HashMap<>();
        edades.put("Juan", 30);
        edades.put("Maria", 25);
        edades.put("Carlos", 40);
        System.out.println("Edad de Maria: " + edades.get("Maria"));
        System.out.println("¿Existe Pedro? " + edades.containsKey("Pedro"));
        edades.remove("Carlos");
        System.out.println("Tamaño del mapa: " + edades.size());
        for(HashMap.Entry<String, Integer> entrada : edades.entrySet()) {
            System.out.println(entrada.getKey() + " -> " + entrada.getValue());
        }
    }