¿Existe una manera elegante de obtener solo uno Entry<K,V>
de HashMap, sin iterar, si no se conoce la clave?
Como el orden de entrada no es importante, ¿podemos decir algo como
hashMapObject.get(zeroth_index);
Aunque soy consciente de que no existe tal método get by index.
Si intenté el enfoque mencionado a continuación, aún tendría que obtener todo el conjunto de entradas del hashmap .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Las sugerencias son bienvenidas.
EDITAR: sugiera cualquier otra estructura de datos para satisfacer el requisito.
java
collections
nilesh
fuente
fuente
firstEntry()
método no está definido en la interfazSortedMap
sino solo enTreeMap
yConcurrentSkipListMap
:(SortedMap
porque tenía elfirstKey()
método.Los mapas no están ordenados, por lo que no existe tal cosa como 'la primera entrada', y esa es también la razón por la cual no hay un método de obtención de índice en
Map
(oHashMap
).Podrías hacer esto:
(Nota: se omite la comprobación de un mapa vacío).
Su código no obtiene todas las entradas en el mapa, regresa inmediatamente (y se rompe del bucle) con la primera entrada que se encuentra.
Para imprimir la clave y el valor de este primer elemento:
Nota: Llamar
iterator()
no significa que esté iterando sobre todo el mapa.fuente
LinkedHashMap
mantiene las claves en el orden en que se insertaron.Map
implementaciones comoLinkedHashMap
yTreeMap
tienen un orden definido. (HashMap
no)Supongo que el iterador puede ser la solución más simple.
Otra solución (no bonita):
O aún (no mejor):
fuente
Obtenga valores, conviértalo en una matriz, obtenga el primer elemento de la matriz:
W.
fuente
Por qué desea evitar llamarlo
entrySet()
, generalmente no crea un objeto completamente nuevo con su propio contexto, sino que simplemente proporciona un objeto de fachada. Simplemente hablandoentrySet()
es una operación bastante barata.fuente
Si está utilizando Java 8, es tan simple como findFirst () :
Ejemplo rápido:
fuente
Si realmente desea la API que sugirió, puede subclasificar HashMap y realizar un seguimiento de las claves en una Lista, por ejemplo. Realmente no veo el punto en esto, pero te da lo que quieres. Si explica el caso de uso previsto, tal vez podamos encontrar una mejor solución.
EDITAR: deliberadamente no profundicé en el lado genérico de esto ...
fuente
¿Qué quieres decir con "sin iterar"?
Puede usar
map.entrySet().iterator().next()
y no iterar a través del mapa (en el sentido de "tocar cada objeto").Entry<K, V>
Sin embargo, no puedes hacerte con un sin usar un iterador. El Javadoc de Map.Entry dice:¿Puede explicar con más detalle lo que está tratando de lograr? Si primero desea manejar objetos, que coinciden con un criterio específico (como "tener una clave en particular") y recurrir a los objetos restantes, de lo contrario, mire un PriorityQueue . Ordena tus objetos en función del orden natural o de una definición personalizada
Comparator
que proporciones.fuente
Este enfoque no funciona porque usaste HashMap. Supongo que usar LinkedHashMap será la solución correcta en este caso.
fuente
Esto obtendría una sola entrada del mapa, que tan cerca como uno puede estar, dado que 'primero' realmente no se aplica.
fuente
Tropecé aquí buscando lo mismo ... Entonces recordé la
Iterables
clase de la biblioteca de Guava .Para obtener el elemento de "primera":
Iterables.getFirst( someMap.values(), null );
.Esencialmente hace lo mismo que
Map.values().iterator().next()
, pero también le permite especificar un valor predeterminado (en este caso nulo) en caso de que no haya nada en el Mapa.Iterables.getLast( someMap.values(), null );
devuelve el último elemento en el mapa.Iterables.get( someMap.values(), 7, null );
devuelve el séptimo elemento en el Mapa si existe, de lo contrario, un valor predeterminado (en este caso, nulo).Sin embargo, recuerde que los HashMaps no están ordenados ... así que no espere
Iterables.getFirst
devolver el primer artículo que arrojó allí ... del mismo modo conIterables.getLast
. Sin embargo, quizás sea útil para obtener un valor mapeado.Puede que no valga la pena agregar la biblioteca de Guava solo por eso, pero si está utilizando algunas de las otras utilidades geniales dentro de esa biblioteca ...
fuente
Después de su EDITAR, aquí está mi sugerencia:
Si solo tiene una entrada, puede reemplazar el Mapa por un objeto dual. Dependiendo de los tipos y sus preferencias:
fuente
fuente
Tengo la respuesta: (es simple)
Tome una ArrayList, luego envíela y encuentre el tamaño de la matriz. Aquí está :
Mostrará el tamaño. (Dar sugerencia). Esta funcionando.
fuente