Bienvenidos sean a este post, hoy haremos un pequeño parate en nuestro proyecto porque hablaremos sobre otra de las colecciones disponibles en Java.
En ocasiones anteriores hemos hablado sobre colecciones, mas exactamente sobre Arrays y ArrayList, los cuales nos permitian almacenar multiple informacion en un solo objeto, la diferencia entre ambos radicaba principalmente en que los arrays necesitan tener un tamaño definido y los ArrayList son mas de tipo dinamico, al margen de que es una clase que nos permite trabajar con metodos sobre los mismos, si bien los hemos aplicado en distintos proyectos hoy nos centraremos en una coleccion que nos brinda otra capacidad.
La coleccion HashMap o Map nos da la posibilidad de asociar nuestro valor con una clave, a diferencia de los anteriores que lo hacen por posicion, aunque esta posibilidad tambien esta disponible, para entender mejor este concepto vamos a crear un ejemplo:
- Dispositivos: Phone and Tablet
- Actividad: Empty Activity
- Nombre: HashMaps
- Nombre de paquete: org.example.hashmaps
- API Minimo: API 14 (Android 4.0)
Una vez creado el proyecto vamos a modificar el codigo de activity_main.xml con el siguiente codigo:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/usuario"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Ingresa el usuario"
android:inputType="textPersonName" />
<Button
android:id="@+id/boton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Buscar" />
<TextView
android:id="@+id/texto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Resultado: " />
</LinearLayout>
Este es un layout simple donde podremos poner un dato, un boton para ejecutar una accion y un campo de texto para mostrar un texto, esto se ve de la siguiente manera

Nuestro siguiente paso sera modificar el MainActivity.java con el siguiente codigo:
MainActivity.java
package org.example.hashmaps;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private Button boton;
private EditText usuario;
private TextView texto;
private Map<String,String> usuarios = new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
usuarios.put("tinchicus","Martin Miranda");
usuarios.put("etortore","Enzo Tortore");
usuarios.put("mariaiju","Marta Gargaglione");
usuarios.put("polizzia","Ariel Polizzi");
usuarios.put("marcuzzj","Javier Marcuzzi");
boton = (Button) findViewById(R.id.boton);
usuario = (EditText) findViewById(R.id.usuario);
texto = (TextView) findViewById(R.id.texto);
boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String clave = usuario.getText().toString();
texto.setText("Resultado: "+ usuarios.get(clave));
}
});
}
}
En este caso tenemos primero cuatro variables, donde las tres primeras son para crear el vinculo entre el layout y nuestro codigo (boton, usuario, texto), como pueden ver son iguales que los elementos del archivo xml, la cuarta sera nuestra coleccion llamada usuarios, vamos a analizar esta ultima:
private Map<String,String> usuarios = new HashMap<>();
En este caso vemos que el tipo es Map y entre los signos <> pondremos el tipo de datos de la clave y el valor, para este caso como vamos a usar solo textos le pusimos String en ambas casos, luego el nombre de la variable y por ultimo lo iniciamos como HashMap porque Map es una interfaz y este otro posee todos los metodos necesarios para trabajar, con esto ya tenemos la coleccion, pasemos al onCreate.
Nota: Si debemos almacenar otro valor y la clave sigue siendo un texto deberian hacerlo de esta forma: Map<String,float>
En este caso primero tendremos las dos lineas basicas para crear el layout de nuestra app, el super y el seteo del view, luego agregaremos los valores a la coleccion, tomemos uno de ejemplo:
usuarios.put("tinchicus","Martin Miranda");
Para agregar un nuevo valor usaremos el metodo put, observen que nuestra clave va a ser un usuario, por ejemplo de red o foro, y el valor sera el nombre y apellido, vemos tambieb que en el resto sera exactamente lo mismo donde tendremos un usuario (clave) y el nombre y apellido (valor), nuestro siguiente paso sera establecer el link entre las variables y los elementos por medio del findViewById y le pasamos el id del codigo en el xml, el ultimo paso sera agregar un «listener» para el boton, en el cual crearemos una nueva variable llamada clave donde obtendremos el valor escrito en usuario, usamos el toString porque no es de tipo String sino Text, por ultimo seteamos el nuevo valor en texto, para este caso respetamos el valor anterior y el valor que posee usuarios en base a la clave informada, vamos a compilarlo y probarlo como se ve en el siguiente video
Con esto tenemos un ejemplo funcional de HashMap o Map, donde podemos rescatar los valores almacenados en base a una clave y en caso de no existir nos devuelve un null, vamos a hacer una pequeña modificacion en nuestro ejemplo, volvamos a activity_main.xml y modifiquemoslo de la siguiente manera:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/usuario"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Ingresa el usuario"
android:inputType="textPersonName" />
<EditText
android:id="@+id/nombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Ingresa el nombre y apellido"
android:inputType="textPersonName" />
<Button
android:id="@+id/agregar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Agregar" />
<TextView
android:id="@+id/texto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Resultado: " />
</LinearLayout>
En este caso agregamos un nuevo campo, el primero sera para ingresar el usuario (que seguiremos usando como clave), luego tendremos uno para ingresar el nombre y apellido, cambiamos el boton que usabamos para buscar para poder agregar los valores anteriores y por ultimo un boton para ordenar pero de eso hablaremos en el codigo, veamos la interfaz como quedo

Con esto mostrado veamos como debemos modificar el codigo, primero cambiaremos este bloque:
private Button boton;
private EditText usuario;
private TextView texto;
private Map<String,String> usuarios = new HashMap<>();
De la siguiente manera:
private Button boton;
private EditText usuario;
private EditText nombre;
private TextView texto;
private Map<String,String> usuarios = new HashMap<>();
En este caso agregamos las variables para los nuevos elementos del layout, nuestra siguiente modificacion sera eliminar o comentar este bloque:
usuarios.put("tinchicus","Martin Miranda");
usuarios.put("etortore","Enzo Tortore");
usuarios.put("mariaiju","Marta Gargaglione");
usuarios.put("polizzia","Ariel Polizzi");
usuarios.put("marcuzzj","Javier Marcuzzi");
Y el siguiente paso sera modificar este bloque:
boton = (Button) findViewById(R.id.boton);
usuario = (EditText) findViewById(R.id.usuario);
texto = (TextView) findViewById(R.id.texto);
De la siguiente manera:
boton = (Button) findViewById(R.id.agregar);
usuario = (EditText) findViewById(R.id.usuario);
nombre = (EditText) findViewById(R.id.nombre);
texto = (TextView) findViewById(R.id.texto);
En este caso modificamos la vinculacion para el boton, luego agregamos a nombre, una vez creadas las vinculaciones con nuestros elementos del layout procederemos a crear los «listeners» para los dos botones, veamos el caso de agregar para ello cambiaremos este bloque:
boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String clave = usuario.getText().toString();
texto.setText("Resultado: "+ usuarios.get(clave));
}
});
De la siguiente manera:
boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String k = usuario.getText().toString();
String v = nombre.getText().toString();
usuarios.put(k,v);
texto.setText("Resultado: ");
for (String clave : usuarios.keySet()){
texto.setText(texto.getText().toString()
+ "\n" + usuarios.get(clave)
+ " (" + clave + ")");
}
}
});
Como anteriormente eliminamos el bloque que se encargaba de agregar los elementos de nuestro Map, ahora debemos proceder a agregar los valores que informemos en los campos, en este caso tenemos dos variables llamadas k y v, las cuales usaremos para almacenar la clave (k) y otro para almacenar el valor (v), despues usamos a put para agregar el valor agregado en k y v, despues volveremos a establecer el valor en texto, por ultimo tenemos un bucle for mejorado donde pasaremos por todas las claves del Map, para ello usaremos una variable llamada clave donde almacenaremos las claves, y el keySet para pasar por todas las claves, el siguiente paso sera agregar al texto anterior por medio de:
texto.getText().toString()
Obtenemos todo el texto anterior, el caracter de escape genera una nueva linea, despues usaremos a get donde pasaremos el valor de la clave para obtener el valor relacionado, y por ultimo cual es su usuario (clave), compilemos y veamos como funciona mediante el siguiente video
Con esto tenemos cubierto como trabaja Map en Java y en Android, como se pueden dar cuenta vamos a tener un par de ventajas importantes a la hora de trabajar con los objetos con respecto a los ArrayList, esta forma de trabajar nos sera muy util en conjunto con el Singleton para el tema que hablaremos en el siguiente post, ante alguna duda pueden visitar este post donde hablo exclusivamente de esta clase.
En resumen, hoy hemos visto otra de las colecciones disponibles, es mas similar a ArrayList, tiene unas sutiles diferencias con respecto a este, hemos hablado de las mismas, hemos creado un par de ejemplos para verlo en accion, primero con los elementos agregados en el codigo y obteniendolos, luego lo hemos modificado para agregar nosotros a los elementos y verlos en pantalla, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.


Donación
Es para mantenimento del sitio, gracias!
$1.00
