Accede a todo EDteam con un único pago¡Sube a premium!
Banner de perfil
0

Victor Ruiz Garcia

@victorruiz946

Estado de Mexico, Mexico

Muy interesante

Victor Ruiz Garcia@victorruiz946

Muy grato conocer como el casteo que vengo haciendo en java o c# es posible hacer en typescript, muy buen curso.


Críticas Constructivas para Mejorar el Curso

Victor Ruiz Garcia@victorruiz946

Considero que, en líneas generales, el curso fue satisfactorio; sin embargo, identifiqué algunas áreas de mejora. En cuanto a la edición de video, observé que en ciertas secciones se realizaron cortes excesivos, resultando en la omisión de algunas explicaciones. En algunos casos, solo se presentó el código sin claridad sobre su origen. Además, sería beneficioso abordar la necesidad de actualizar el código en relación con las referencias, indicando específicamente la versión de Java requerida debido a la obsolescencia de algunas dependencias o incluso su eliminación.

Me habría gustado profundizar en la implementación de la validación del token en otras APIs, como se mencionó al final del video. La explicación sobre la necesidad de enviar el token junto con cada solicitud de API para su validación hubiera sido esclarecedora. Esta omisión dejó un vacío en mi comprensión, y me habría gustado aprender cómo abordar este aspecto concreto.

Finalmente, considero que hubiera sido crucial incluir un segmento sobre cómo publicar el proyecto en un servicio de alojamiento web para que pueda ser consumido. Este paso es fundamental para poner en práctica lo aprendido y permitir que el proyecto sea accesible para su uso real. En resumen, estas adiciones habrían enriquecido la experiencia de aprendizaje y proporcionado una comprensión más completa del tema.


Concepto de Hashtable

Victor Ruiz Garcia@victorruiz946

Imagina que tienes un libro y necesitas encontrar información en él rápidamente. En lugar de leer todo el libro de principio a fin, podrías usar un índice que te diga en qué página puedes encontrar cada tema.

Un Hashtable en Java es como ese índice. Es una estructura de datos que almacena información en pares de "clave" y "valor". La "clave" sería como el término que buscas en el índice, y el "valor" sería la información asociada a esa clave.

Para encontrar información en un Hashtable, en lugar de leer todo el contenido, usas una función especial (llamada función de dispersión) que te indica dónde está almacenada la información que buscas. Esto hace que las búsquedas sean muy rápidas.

Además, el Hashtable en Java es como un índice que puedes compartir con amigos, pero con la precaución de que solo uno puede escribir en él a la vez para evitar confusiones (es sincronizado para operaciones concurrentes).

En resumen, un Hashtable es una estructura de datos que utiliza funciones de dispersión para asignar claves a ubicaciones específicas, garantizando al mismo tiempo la seguridad en entornos de ejecución concurrente a expensas de cierta pérdida de rendimiento.


Porque agregar 2 metodos para agregar elementos

Victor Ruiz Garcia@victorruiz946

Cuando estudie listas en la universidad desde un principio nos enseñaron a hacer las cosas bien y por tanto solo se hizo 1 metodo para agregar nodos a la lista por tanto creo que deberian tener ese enfoque, si es dificil lo se pero sino empezamos bien desde el inicio despues tendremos problemas. Aqui dejo un ejemplo de como deberian quedar los metodos.

Class Nodo { int dato; Nodo siguiente;

public Nodo(int dato) {
    this.dato = dato;
    this.siguiente = null;
}

}

class ListaEnlazada { private Nodo primero;

public ListaEnlazada() {
    this.primero = null;
}

// Método para agregar un nuevo nodo al final de la lista
public void agregar(int dato) {
    Nodo nuevoNodo = new Nodo(dato);
    if (primero == null) {
        primero = nuevoNodo;
    } else {
        Nodo actual = primero;
        while (actual.siguiente != null) {
            actual = actual.siguiente;
        }
        actual.siguiente = nuevoNodo;
    }
}

// Método para eliminar un nodo con un valor específico
public void eliminar(int dato) {
    if (primero == null) {
        return;
    }

    if (primero.dato == dato) {
        primero = primero.siguiente;
        return;
    }

    Nodo actual = primero;
    while (actual.siguiente != null && actual.siguiente.dato != dato) {
        actual = actual.siguiente;
    }

    if (actual.siguiente != null) {
        actual.siguiente = actual.siguiente.siguiente;
    }
}

// Método para buscar un nodo con un valor específico
public boolean buscar(int dato) {
    Nodo actual = primero;
    while (actual != null) {
        if (actual.dato == dato) {
            return true;
        }
        actual = actual.siguiente;
    }
    return false;
}

// Método para mostrar todos los nodos en la lista
public void mostrar() {
    Nodo actual = primero;
    while (actual != null) {
        System.out.print(actual.dato + " ");
        actual = actual.siguiente;
    }
    System.out.println();
}

}

public class Main { public static void main(String[] args) { ListaEnlazada lista = new ListaEnlazada();

    lista.agregar(1);
    lista.agregar(2);
    lista.agregar(3);
    lista.agregar(4);

    System.out.println("Lista inicial:");
    lista.mostrar();

    lista.eliminar(2);
    System.out.println("Lista después de eliminar el nodo con valor 2:");
    lista.mostrar();

    System.out.println("¿El valor 3 está en la lista? " + lista.buscar(3));
    System.out.println("¿El valor 5 está en la lista? " + lista.buscar(5));
}

}


Lista enlazada

Victor Ruiz Garcia@victorruiz946

// Clase Nodo que representa un elemento en la lista class Nodo { int dato; Nodo siguiente;

// Constructor
public Nodo(int dato) {
    this.dato = dato;
    this.siguiente = null;
}

}

// Clase ListaEnlazada que representa la lista enlazada class ListaEnlazada { Nodo cabeza; // Primer nodo de la lista

// Constructor
public ListaEnlazada() {
    this.cabeza = null;
}

// Método para agregar un nuevo nodo al final de la lista
public void agregarAlFinal(int dato) {
    Nodo nuevoNodo = new Nodo(dato);
    if (cabeza == null) {
        cabeza = nuevoNodo;
    } else {
        Nodo temp = cabeza;
        while (temp.siguiente != null) {
            temp = temp.siguiente;
        }
        temp.siguiente = nuevoNodo;
    }
}

// Método para imprimir los elementos de la lista
public void imprimirLista() {
    Nodo temp = cabeza;
    while (temp != null) {
        System.out.print(temp.dato + " ");
        temp = temp.siguiente;
    }
    System.out.println();
}

}

public class ListaEnlazadaEjemplo { public static void main(String[] args) { // Crear una lista enlazada ListaEnlazada lista = new ListaEnlazada();

    // Agregar elementos a la lista
    lista.agregarAlFinal(1);
    lista.agregarAlFinal(2);
    lista.agregarAlFinal(3);

    // Imprimir la lista
    System.out.print("Lista: ");
    lista.imprimirLista();
}

} si tus necesidades son sencillas y las implementaciones existentes satisfacen tus requisitos de rendimiento, es generalmente preferible usar las clases proporcionadas por Java, como ArrayList o LinkedList. Si necesitas control detallado sobre la implementación o funcionalidades específicas, puedes considerar la implementación de tu propia lista enlazada como el ejemplo mostrado arriba. Sin embargo, ten en cuenta que reinventar la rueda puede no ser necesario en la mayoría de los casos, y es preferible utilizar las estructuras de datos estándar que Java proporciona.


Sincronizacion en vectores

Victor Ruiz Garcia@victorruiz946

La sincronización en el contexto de los Vectores en Java se refiere a la capacidad del Vector para ser utilizado de manera segura en entornos multihilo. En otras palabras, un Vector es "sincronizado" porque sus métodos principales están diseñados para ser seguros para el uso concurrente, lo que significa que se pueden utilizar de manera coherente y predecible en un programa que tiene varios hilos de ejecución.

La sincronización en los Vectores es importante en situaciones donde múltiples hilos pueden acceder y modificar el mismo Vector al mismo tiempo. Sin la sincronización, podrían ocurrir problemas de concurrencia, como condiciones de carrera y resultados inesperados.

Cuando un método de un Vector es sincronizado, significa que se ha diseñado para que, cuando se ejecuta, bloquee automáticamente el Vector para otros hilos hasta que se complete la operación. Esto garantiza que ninguna otra operación pueda interferir mientras una operación está en curso.

Por ejemplo, si tienes un Vector y dos hilos que intentan agregar elementos simultáneamente, el Vector garantizará que estas operaciones de agregar se ejecuten de manera secuencial, evitando problemas de consistencia de datos.

Aquí hay un ejemplo sencillo:

java Copy code import java.util.Vector;

public class SynchronizedVectorExample { public static void main(String[] args) { // Crear un Vector sincronizado Vector<Integer> synchronizedVector = new Vector<>();

    // Crear dos hilos que intentan agregar elementos al Vector simultáneamente
    Thread thread1 = new Thread(() -&gt; {
        for (int i = 0; i &lt; 5; i++) {
            synchronizedVector.add(i);
        }
    });

    Thread thread2 = new Thread(() -&gt; {
        for (int i = 5; i &lt; 10; i++) {
            synchronizedVector.add(i);
        }
    });

    // Iniciar los hilos
    thread1.start();
    thread2.start();

    // Esperar a que ambos hilos terminen
    try {
        thread1.join();
        thread2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    // Imprimir el Vector resultante
    System.out.println(synchronizedVector);
}

} En este ejemplo, aunque los dos hilos están agregando elementos al Vector simultáneamente, la sincronización del Vector garantiza que estas operaciones se realicen de manera segura sin conflictos. Sin embargo, a pesar de esta seguridad, la sincronización introduce cierto costo en términos de rendimiento, por lo que en situaciones donde no hay concurrencia, se pueden preferir otras estructuras de datos no sincronizadas, como ArrayList.


Clases y objetos

Victor Ruiz Garcia@victorruiz946

A mi me gusta pensar en las clases como un molde para galletas y las galletas hechas con el molde son los objetos.


Y si usamos el metodo sort de Arrays?

Victor Ruiz Garcia@victorruiz946

import java.util.Arrays;

public class Ordenar { public static void main(String[] args) { int[] arreglo = {5, 2, 8, 1, 7}; Arrays.sort(arreglo);

    for (int elemento : arreglo) {
        System.out.print(elemento + &#34; &#34;);
    }
}

}


Como salir del comando log

Victor Ruiz Garcia@victorruiz946

Algo que creo que no se dice es, que si estamos usando el comando git log y despues deseamos salir de el, debemos usar la tecla q.


Prefijos en los mensajes

Victor Ruiz Garcia@victorruiz946

Algo importante que tambien se debe considerar en los mensajes cuando estamos desarrollando una aplicacion es el uso de prefijos, como los siguientes:

fix: Corrige un error o un problema. update: Realiza una actualización que no es una corrección de errores ni una nueva característica importante. feat: Añade una nueva característica o desarrollo. chore: Realiza cambios no directamente relacionados con la lógica empresarial (tareas de construcción, configuración, etc.). docs: Realiza cambios en la documentación. style: Realiza cambios que no afectan la lógica del código (espacios en blanco, formato, etc.). test: Agrega o modifica pruebas. refactor: Realiza cambios en el código sin cambiar su comportamiento externo. perf: Realiza mejoras de rendimiento. revert: Revierte un commit anterior. build :Realiza cambios que afectan al sistema de construcción o a las dependencias externas. ci: Realiza cambios en la configuración o en los scripts de CI/CD.


Pregunta a ChatEDT