Tres formas de encontrar un elemento en una matriz Java
Fuente:
Asyncq Esta publicación lo ayudará a comprender mejor las diferentes formas de buscar un elemento en una matriz en Java. Encontrar un elemento específico en un conjunto de valores es una operación muy común y utilizada con frecuencia en el desarrollo de software. Existen diferentes enfoques para resolver este problema, desde simples hasta optimizados. Mirémoslos.
Datos de entrada
La matriz de entrada contiene datos de identificación primitivos y necesitamos saber si contiene id->3.
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
int inputId = 3;
Método 1 (sencillo)
- Visitamos todos los elementos del array, un elemento a la vez.
- Además, realizamos un seguimiento del estado del elemento de destino si existe en la matriz.
- Tan pronto como encontramos este elemento, cambiamos el estado de falso a verdadero .
- Una vez que se completa el ciclo, devolvemos el indicador de estado.
boolean valExist = false;
for (int id : ids) {
if (inputId == id) {
valExist = true;
}
}
return valExist;
Esta solución funciona, pero no es muy eficiente. Si observa la condición
if , se dará cuenta de que estamos probando esta condición para todos los elementos. Digamos que el elemento que estamos buscando es el primer elemento, pero nuestro bucle seguirá ejecutándose para todos los elementos. Aquí sería más prudente salir del bucle tan pronto como encontremos el elemento. Haciendo esto nos ahorraríamos en cálculos cuando el elemento que buscamos no esté en la última posición.
boolean valExist = false;
for (int id : ids) {
if (inputId == id) {
valExist = true;
break;
}
}
return valExist;
Puedes hacer que tu código sea aún más conciso usando
return . Podemos devolver
verdadero tan pronto como veamos el elemento que estamos buscando; de lo contrario, devolvemos
falso tan pronto como se complete el ciclo. Y no necesitamos crear y mantener una variable de estado.
for (int id : ids) {
if (inputId == id) {
return true;
}
}
return false;
Método 2
- Podemos usar un ArrayList que contenga un método que de forma predeterminada busque el elemento de destino en la lista.
- Dado que List proporciona este método , necesitamos convertir nuestra matriz primitiva en una lista.
- Podemos usar una única cadena lambda que convierte una primitiva en un tipo de objeto y crea una lista a partir de ella.
return Arrays.asList(Arrays.stream(ids).boxed().toArray())
.contains(inputId);
- Podemos usar Java 8 Stream API para hacer que nuestro código sea funcional y mucho más corto.
- Para comprender cómo funcionan las API de Stream con las transmisiones, necesitamos convertir nuestra matriz de entrada en una secuencia.
- Arrays.stream toma la matriz de entrada y la convierte en secuencias.
- Ahora que tenemos hilos, podemos usar muchos métodos útiles, uno de los cuales es anyMatch . Devuelve el elemento que coincide con el predicado (id == inputId) .
- Todo esto hace que nuestro código sea mucho más corto y fácil de leer.
return Arrays.stream(ids)
.anyMatch(id -> id == inputId);
Método 3 (optimizado)
Sí, el código que se muestra arriba funciona y es fácil de leer, pero aún debemos visitar y comparar cada elemento de la secuencia.
- Si la memoria no es un problema y queremos optimizar los cálculos, entonces una de las cosas que podemos hacer aquí es crear un conjunto a partir de la matriz de entrada.
- Podemos usar nuevamente código de estilo funcional para convertir la matriz primitiva en un Set .
- Ahora que tenemos un Set , podemos buscar un elemento durante un período de tiempo constante.
S
et<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return idsSet.contains(inputId);
Prima
La búsqueda de un solo elemento puede considerarse una operación común, pero lo más común es buscar varios elementos en una matriz. En este caso, si no usamos
Set , tendremos dos bucles y la complejidad del tiempo aumentará para multiplicar la longitud de las dos colecciones. A continuación se muestra un ejemplo en el que convertimos una de las matrices como un conjunto y luego iteramos sobre la otra matriz y realizamos una búsqueda en la operación del conjunto. Al hacer esto, aumentamos la memoria y al mismo tiempo ahorramos en cálculos.
int[] targetIds = { 1, 3, 6, 88, 999, 34, 44, 55};
int[] ids = { 1,2,13,14,15,3,10,11,12,4,5,6,7,8,9 };
Set<Integer> idsSet = Arrays.stream(ids).boxed().collect(Collectors.toSet());
return Arrays.stream(targetIds)
.boxed()
.filter(id -> !idsSet.contains(id))
.mapToInt(a -> a)
.toArray();
¿Qué es Java Thread Local y cómo usarlo?
Fuente:
Medio En este artículo, veremos Java Thread Local y cómo usarlo de manera efectiva en sus aplicaciones Java. Java
Thread Local es una característica poderosa que permite a los desarrolladores crear variables solo para un hilo específico. Esto significa que cada hilo puede tener su propia copia de una variable y los cambios realizados a una variable en un hilo no afectarán su valor en otro hilo.
¿Qué es el hilo local?
Thread Local es una clase en la API de Java que le permite crear variables locales para un hilo específico. Es decir, cada hilo tiene su propia copia de la variable y los cambios realizados a una variable en un hilo no afectan su valor en otro hilo. Esto convierte
a Thread Local en una solución ideal para almacenar datos específicos de subprocesos, como información de autenticación de usuarios, conexiones de bases de datos o cualquier otra información específica de subprocesos.
Cómo funciona Thread Local en Java
Para utilizar
Thread Local en su aplicación Java, primero debe crear una instancia de la clase
Thread Local . Esto se puede hacer llamando al constructor
ThreadLocal , que creará una nueva instancia de esta clase. A continuación, al crear un objeto
Thread Local , puede usarlo para almacenar y recuperar datos específicos del hilo. A continuación se muestra un ejemplo de cómo utilizar
Thread Local en su aplicación Java:
public class MyThreadLocalClass {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void set(String value) {
threadLocal.set(value);
}
public static String get() {
return threadLocal.get();
}
}
En este ejemplo, creamos un objeto
Thread Local llamado
threadLocal de tipo
String . También creamos dos métodos:
set() y
get() que nos permiten almacenar y recuperar el valor de la variable
Thread Local . Para almacenar un valor en una variable
Thread Local , simplemente llamamos al método
set() y pasamos el valor que queremos almacenar. Por ejemplo, podemos llamar a
MyThreadLocalClass.set("¡Hola, mundo!") para almacenar la cadena
"¡Hola, mundo!" en
la variable Thread Local . Para obtener el valor de la variable
Thread Local , simplemente llamamos
al método get() . Por ejemplo, podemos llamar
a String value = MyThreadLocalClass.get() para obtener el valor de la variable
Thread Local .
Recomendaciones para trabajar con Thread Local
Aunque
Thread Local puede ser una herramienta poderosa en sus aplicaciones Java, es importante utilizarla correctamente para evitar posibles problemas. Aquí hay algunas pautas a tener en cuenta al usar
Thread Local :
- Utilice Thread Local solo cuando sea necesario: solo para datos específicos de subprocesos. Si los datos no son específicos de un hilo, deben almacenarse de otra manera.
- Evite el uso excesivo de memoria: Thread Local puede consumir una cantidad significativa de memoria si no se usa con cuidado. Asegúrese de borrar las variables de Thread Local cuando ya no sean necesarias para evitar el uso excesivo de memoria.
- Utilice Thread Local con precaución en entornos de subprocesos múltiples: es importante comprender los riesgos y limitaciones potenciales. Asegúrese de probar su código minuciosamente para asegurarse de que Thread Local funcione como se espera en su entorno específico.
Conclusión
Java
Thread Local es una gran herramienta que permite a los desarrolladores crear variables solo para un hilo específico. Con
Thread Local , puede almacenar datos específicos de subprocesos, como información de autenticación de usuario, conexiones de bases de datos u otra información específica de subprocesos. Aunque
Thread Local puede ser una herramienta poderosa, es importante utilizarla correctamente para evitar posibles problemas. Si sigue las mejores prácticas y prueba su código, podrá utilizarlo de manera efectiva para mejorar el rendimiento y la confiabilidad de sus aplicaciones Java.
GO TO FULL VERSION