visual vertical uiswing tutorial tipos layouts javase fillers docs crear con borde java collections

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:

  1. Crea una lista de Recursos
  2. Genera un número al azar y obtén el artículo
  3. Haz lo que quieras con tu elemento aleatorio
  4. 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.