repetir rango numeros metodos metodo generar arreglo aleatorios java map range-map

numeros - Obtener valores para claves dentro de un rango en Java



metodos de hashmap java (6)

Supongamos que tengo un mapa en Java que se ve así:

{ 39:"39 to 41", 41:"41 to 43", 43:"43 to 45", 45:">=45" }

Si las claves están ordenadas (ya sea usando treemap o linkedhashmap). Ahora si intento obtener un valor que sea> = 39 y <41. Luego debería obtener la cadena "39 a 41". Cómo lo hago de manera eficiente ?


Con un mapa ordenado, podrías hacer algo como eso:

SortedMap<Integer,String> head = map.headMap(value+1); if (head.isEmpty()) { return null; } else { return head.get(head.lastKey()); }


No estoy seguro de que sea fácil. Una sugerencia sería "rellenar los huecos", es decir, poner un valor 40->"39 to 41" etc. Supongo que eso solo será posible si conoce el rango completo de números posibles en el mapa.

O mabybe algo que anula la verificación para ver si el valor está en el mapa, y expandiéndose hasta que encuentre algo. No estoy seguro de que sea posible en su forma actual, ya que tendrías que terminar analizando las cadenas de valor.


Parece que quieres más que un SortedMap ; ¡quieres un NavigableMap ! Específicamente, puede usar la operación floorKey .

Aquí hay un ejemplo:

NavigableMap<Integer,String> map = new TreeMap<Integer, String>(); map.put(0, "Kid"); map.put(11, "Teens"); map.put(20, "Twenties"); map.put(30, "Thirties"); map.put(40, "Forties"); map.put(50, "Senior"); map.put(100, "OMG OMG OMG!"); System.out.println(map.get(map.floorKey(13))); // Teens System.out.println(map.get(map.floorKey(29))); // Twenties System.out.println(map.get(map.floorKey(30))); // Thirties System.out.println(map.floorEntry(42).getValue()); // Forties System.out.println(map.get(map.floorKey(666))); // OMG OMG OMG!

Tenga en cuenta que también hay ceilingKey , lowerKey , higherKey , y también …Entry lugar de …Key funciona también y devuelve Map.Entry<K,V> lugar de solo K



Puede buscar recursivamente un límite inferior.

public String descriptionFor(int value) { String description = map.get(value); return description == null ? descriptionFor(value--) : description; }

Necesitará tener un límite mínimo.


Tendría que implementar ese mapa usted mismo, creo. Tienes razón en que debería ser ordenado; la implementación de get tendría que iterar a través de las claves hasta que encuentre la clave más grande que sea menor o igual que el argumento.

Si subclase TreeMap , inicialmente parecería que puede hacer que esto funcione simplemente anulando el método get() . Sin embargo, para mantener la mayor cantidad posible del contrato de Map, tendrá que anular otros métodos para mantener la coherencia.

¿Y qué pasa con, por ejemplo, containsKey() ? ¿Tu main contiene un mapeo para 40 ? Si devuelve false , entonces un cliente puede decidir no llamar a get() basado en esta información; por estas razones (y la definición formal) tienes que volver true . Pero luego hace que sea difícil determinar si el mapa "realmente contiene" un mapeo dado; si está buscando hacer algo como actualizar sin sobrescribir nada que ya exista.

El método remove() puede ser complicado. De mi lectura de la interfaz,

// Calling map.remove "Removes the mapping for a key from this map if it is present." map.remove(x); // Now that the mapping is removed, I believe the following must hold assert map.get(x) == null; assert map.containsKey(x);

Actuar consistentemente aquí sería muy complicado. Si tiene un mapeo de 35-40 por ejemplo, y llama a remove(38) , entonces, según lo entiendo, tendrá que devolver null para cualquier obtención posterior de la clave 38, pero devuelva el mapeo antes mencionado para las claves 35- 37 o 39-40.

Entonces, si bien puede comenzar con esto sobreponiendo TreeMap, quizás todo el concepto de Map no sea exactamente lo que quiere aquí. A menos que necesite este comportamiento para encajar en los métodos existentes que toman Map , podría ser más fácil crearlo usted mismo como una clase distinta ya que no es un Map, la forma en que lo está definiendo.