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
class
Maps
{
public static void main (String[] args){}
}

This code segment functions to: Demonstrate common operations on a key-value storage structure, including insertion, retrieval, existence checks, modification, and collection status monitoring while maintaining and updating paired data entries.

```java
[TASK_BEGIN]
    public static void main(String[] args) {
        // Create a HashMap to store String keys and Integer values
        HashMap<String, Integer> ages = new HashMap<>();

        // Add entries to the map
        ages.put("Alice", 30);
        ages.put("Bob", 25);
        ages.put("Charlie", 35);

        // Get a value
        System.out.println("Alice's age: " + ages.get("Alice"));

        // Check if key exists
        System.out.println("Contains David: " + ages.containsKey("David"));

        // Remove an entry
        ages.remove("Bob");
        System.out.println("After removal - Size: " + ages.size());

        // Iterate through entries
        for (HashMap.Entry<String, Integer> entry : ages.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
[TASK_END]
```

public static void main(String[] args) {
        HashMap<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 30);
        ages.put("Bob", 25);
        ages.put("Charlie", 35);
        System.out.println("Alice's age: " + ages.get("Alice"));
        System.out.println("Contains David: " + ages.containsKey("David"));
        ages.remove("Bob");
        System.out.println("After removal - Size: " + ages.size());
        for (HashMap.Entry<String, Integer> entry : ages.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }