Necesito un mapa múltiple cuyas claves no distinguen entre mayúsculas y minúsculas. ¿existe tal implementación en las colecciones de google?hay un multimapa insensible a mayúsculas y minúsculas en las colecciones de google
Respuesta
Aquí es una versión insensible caso de un ForwardingMap
:
public class CaseInsensitiveForwardingMap<V> extends ForwardingMap<String, V>
implements Serializable{
private static final long serialVersionUID = -7741335486707072323L;
// default constructor
public CaseInsensitiveForwardingMap(){
this(new HashMap<String, V>());
}
// constructor with a supplied map
public CaseInsensitiveForwardingMap(final Map<String, V> inner){
this.inner = inner;
}
private final Map<String, V> inner;
@Override
protected Map<String, V> delegate(){
return inner;
}
// convert keys to lower case Strings, preserve null keys
private static String lower(final Object key){
return key == null ? null : key.toString().toLowerCase();
}
@Override
public V get(final Object key){ return inner.get(lower(key)); }
@Override
public void putAll(final Map<? extends String, ? extends V> map){
if(map == null || map.isEmpty()){ inner.putAll(map); }
else{
for(final Entry<? extends String, ? extends V> entry :
map.entrySet()){
inner.put(lower(entry.getKey()), entry.getValue());
}
}
}
@Override
public V remove(final Object object){ return inner.remove(lower(object)); }
@Override
public boolean containsKey(final Object key){
return inner.containsKey(lower(key));
}
@Override
public V put(final String key, final V value){
return inner.put(lower(key), value);
}
}
El uso de este mapa, puede crear el MultiMap
utilizando los métodos de proveedores MultiMaps
.
Ejemplo:
Map<String, Collection<String>> map =
new CaseInsensitiveForwardingMap<Collection<String>>();
Multimap<String, String> caseInsensitiveMultiMap =
Multimaps.newMultimap(map, new Supplier<Collection<String>>(){
@Override
public Collection<String> get(){ return Sets.newHashSet(); }
});
Advertencia: keySet()
sólo devolverá los valores en minúsculas, independientemente de cómo se introdujeron las llaves.
Tenga en cuenta que es mejor usar String.toUpperCase en lugar de String.toLowerCase para esto, ya que algunos caracteres se asignan a varios caracteres mientras están en mayúscula, pero no mientras están en minúscula. Por ejemplo, el caracter '\ u00df' está mapeado en mayúscula' \ u0053 \ u0053', mientras que '\ u0053 \ u0053' está mapeado en minúscula' \ u0073 \ u0073'. Pero obviamente '\ u00df' no se considera lo mismo que' \ u0073 \ u0073' mientras que semánticamente sí lo es. –
@ Frór wow, ¡no lo sabía! ¡Gracias! –
No, pero presumiblemente está utilizando las teclas de cadena? Si es así, ¿por qué no simplemente normalizar todos los accesos a un multimap regular? Para el caso del 80%, eso hará que todas las llamadas se pongan y se ponga la tecla en minúscula.
Para una discusión completa de los problemas con Multimapas mayúsculas y minúsculas, ver this google group discussion
No se pudo utilizar una Map<String,List<Payload>>
y darle un Comparator<String>
que hizo un sensible a las mayúsculas comparar?
Parece que ni Google Collections ni los marcos de la Colección Apache tienen un multimapa que acepta un Comparador para evaluar la igualdad de claves.
Utilice [MultiMaps.newListMultiMap()] (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/ google/common/collect/Multimaps.html # newListMultimap% 28java.util.Map% 2C% 20com.google.common.base.Supplier% 29) y proporciona un 'TreeMap' con un comparador personalizado –
el estándar java es igual aIgnoreCase llama a LowCase internamente – sds
Puede definir un Comparador de Cadenas insensible a mayúsculas y minúsculas usando un Collator. Luego crea un TreeMultimap con claves ordenadas por ese Comparador.
- 1. Una lista insensible a mayúsculas y minúsculas
- 2. Insensible a mayúsculas/minúsculas #define
- 3. Cadena insensible a mayúsculas y minúsculas :: find
- 4. Deserialización de propiedades insensible a las mayúsculas y minúsculas Json.NET
- 5. LINQ contiene insensible a mayúsculas y minúsculas
- 6. KVC insensible a mayúsculas/minúsculas en Cocoa?
- 7. Analizador-analizador Scala insensible a las mayúsculas y minúsculas
- 8. ¿SHA-256 es insensible a las mayúsculas y minúsculas?
- 9. ordenación de lista insensible a mayúsculas y minúsculas, sin minúsculas?
- 10. Cadena KeyedCollection Insensible a las mayúsculas y minúsculas
- 11. Búsqueda de lista insensible a mayúsculas/minúsculas
- 12. ¿AutoMapper es sensible o insensible a las mayúsculas y minúsculas?
- 13. SOLR Búsqueda insensible a mayúsculas/minúsculas
- 14. Búsqueda insensible a mayúsculas y minúsculas en Sybase
- 15. Clasificación insensible a mayúsculas/minúsculas con Google Guava
- 16. Búsqueda insensible a mayúsculas y minúsculas de palabras en mongoid
- 17. Collation insensible a mayúsculas y minúsculas en Oracle con LIKE
- 18. Búsqueda insensible a mayúsculas/minúsculas usando Hibernate
- 19. Sustitución de cadenas insensible a mayúsculas y minúsculas en JavaScript?
- 20. JavaScript: búsqueda insensible a mayúsculas/minúsculas
- 21. Búsqueda insensible a mayúsculas y minúsculas con $ en
- 22. Insensible a mayúsculas/minúsculas reemplace todo
- 23. Diccionario insensible a mayúsculas/minúsculas no funciona
- 24. Búsqueda insensible a mayúsculas y minúsculas en el campo varbinary?
- 25. Coincidencia insensible a mayúsculas y minúsculas en xpath?
- 26. Linq a Sql distinción insensible a mayúsculas y minúsculas
- 27. Complemento de nombre de archivo insensible a mayúsculas y minúsculas
- 28. Arreglo insensible a mayúsculas y minúsculas en Lua
- 29. Regex insensible a mayúsculas y minúsculas en javascript
- 30. Findall insensible a mayúsculas y minúsculas en Python ElementTree
Se desaprueban las colecciones de Google, y se agrega la etiqueta guava, ya que es el sucesor de las colecciones de google –