vertical - tipos de border en java
¿Qué tipo de colección de Java debería usar para esto? (4)
Blockquote
si necesitas un orden aleatorio mejor puedes ir al objeto Lista.
List<String> resourceMap = new CopyOnWriteArrayList<>();
resourceMap.add("hex1");
resourceMap.add("hex2");
resourceMap.add("hex3");
resourceMap.add("hex4");
Collections.shuffle(resourceMap);
resourceMap.forEach(resource->{
resourceMap.remove(resource);
});
Soy bastante nuevo en Java y tengo problemas para entender las diferencias entre diferentes colecciones. Tengo una lista de 19 recursos. A cada recurso se le asigna un color hexadecimal. Quiero obtener un recurso aleatorio con su color y usar ese recurso con mi código. Una vez que haya terminado con el recurso actual, quiero eliminarlo de la lista para que solo se use una cierta cantidad de recursos.
¿Debo usar un diccionario, mapa o hashtable? O cualquier otro que me estoy perdiendo.
Lo que podría hacer es almacenar sus recursos en una List
y luego cambiarlos aleatoriamente gracias a Collections.shuffle(List<?> list)
o shuffle(List<?> list, Random rnd)
, y finalmente invocar iterator()
en el lista resultante para obtener una instancia de Iterator
que puede almacenar en un campo miembro para poder iterar sobre su lista (gracias a hasNext()
/ next()
) y eliminar su recurso una vez hecho con remove()
.
Aquí hay un pseudo código que usa String
como recurso solo para mostrar la idea:
// Create a read/write list (Arrays.asList returns a read-only list)
List<String> resources = new ArrayList<>(Arrays.asList("1", "2", "3"));
System.out.printf("Initial state = %s%n", resources);
Collections.shuffle(resources);
System.out.printf("Permuted List = %s%n", resources);
Iterator<String> iterator = resources.iterator();
if (iterator.hasNext()) {
String resource = iterator.next();
// do something
iterator.remove();
System.out.printf("After remove = %s%n", resources);
}
Salida:
Initial state = [1, 2, 3]
Permuted List = [3, 1, 2]
After remove = [1, 2]
NB: Este enfoque tiene sentido en su caso, ya que tiene una lista pequeña, tenga en cuenta que si tiene una gran lista y tiene la intención de recuperar solo una pequeña parte de ella, debe considerar usar un Random
para obtener aleatoriamente el índice de la siguiente elemento (usando nextInt(int bound)
con list.size()
como parámetro) get (usando get(int index)
) y remove (usando remove(int index)
) en lugar de usar Collections.shuffle(List<?> list)
ya que causaría una sobrecarga.
ArrayList
no funcionaría porque necesito asignar el color (valor) al recurso (clave)
Sí, puede funcionar si usa una List
de una clase contenedora que contendrá tanto su color como su recurso (por ejemplo, AbstractMap.SimpleImmutableEntry
o simplemente una clase personalizada). Es lo suficientemente bueno ya que no parece necesitar recuperar el color por recurso. Si lo hace, podría simplemente tener un Map
con recurso como clave y color como valor y usar una new ArrayList<>(map.keySet())
para inicializar su lista de recursos, entonces podrá aplicar lo que se propuso anteriormente en esta respuesta
Lo siguiente debería funcionar Los pasos son:
- Crea una lista de Recursos
- Genera un número al azar y obtén el artículo
- Haz lo que quieras con tu elemento aleatorio
- Eliminarlo de la lista
Código de ejemplo:
//1
List<Resource> resources= getList();
//2
Random generator = new Random();
Resource randomResource = resources.get(generator.nextInt(resources.size() -1));
//3
//do your stuff
//4
resources.remove(randomResource);
El recurso puede ser una clase que envuelve tus datos
class Resource{
String color;
String otherProperties;
//..
@Override
public boolean equals(Object obj) {
//generate from IDE or write one
}
@Override
public int hashCode() {
//generate from IDE or write one
}
}
Si desea buscar (obtener) recurso basado en su uso hexadecimal siguiente
// Initialize
Map<String, Resource> resourceMap = new HashMap<>();
resourceMap.put("hex1", hex1Resource);
resourceMap.put("hex2", hex3Resource);
resourceMap.put("hex3", hex3Resource);
// Get specific
Resource hex2Resource = resourceMap.get("hex2");
resourceMap.remove("hex2");
Si desea buscar recursos aleatoriamente, hay 2 opciones
- Use List (esto permite duplicados)
- Use Establecer (almacena solo valores únicos)
Usando Listas
// Initialize
List<Resource> list = new ArrayList<>();
list.add(resource1);
list.add(resource2);
list.add(resource3);
// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));
// Delete the element from list
list.remove(randomResource);
Usando juegos
// Initialize
Set<Resource> set = new HashSet<>();
set.add(resource1);
set.add(resource2);
set.add(resource3);
// Convert to List, since Set does not have get(int) method.
List<Resource> list = new ArrayList<>(set);
// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));
// Delete the element from list
list.remove(randomResource);
Nota : Para los dos casos anteriores, la clase de recursos necesitará implementar métodos iguales y código hash para que la lista / conjunto pueda comparar elementos y trabajar correctamente. Ver Java equal y hashcode
Actualización : los conjuntos no tienen el método get (int). Actualizado el código para arreglar esto.