Usar dos (o más) objetos como clave HashMap

Quiero almacenar ciertos objetos en un HashMap. El problema es que, por lo general, solo usa un solo objeto como clave. (Puede, por ejemplo, usar una cadena.) Lo que quiero hacer para usar varios objetos. Por ejemplo, una clase y una cadena. ¿Hay una manera simple y limpia de implementar eso?

Respuesta 1

Tiendo a usar una lista

map.put(Arrays.asList(keyClass, keyString), value)
Respuesta: 2

Las colecciones de Apache Commons tienen un mapa multiciclo que puede serle útil:

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/keyvalue/MultiKey.html

Parece que manejará hasta 5 "llaves".

Respuesta: 3

¿Quiere decir que el objeto tendrá dos teclas, o más bien una tecla que consta de dos cosas?

Si quieres el primer caso. Es decir, un objeto objetivado por dos teclas, digamos una clase o un objeto, debe usar dos mapas.

Map<Key1, value>

Map<Key2, value>

En el segundo caso, necesita un mapa de mapas, entonces:

Map<Key1, Map<Key2, value>>
Respuesta: 4

Puede crear una clase de titular que contenga la clase y la cadena que desee como claves.

public class Key {

    public MyClass key_class;
    public String key_string;

    public Key(){
        key_class = new MyClass();
        key_string = "";
    }

}

Probablemente no sea la mejor solución, sino una posibilidad.

Respuesta: 5

Hay algunos lugares donde la gente sugiere crear una clase "Clave" que contenga a los demás, estoy totalmente de acuerdo. Solo pensé que agregaría una pista útil.

Si usa eclipse o netbeans, tienen una buena opción: puede decirle a Eclipse que cree métodos igual y hashcode basados ​​en uno o más miembros. Por lo tanto, simplemente seleccione el miembro (o miembros) que desea recuperar y NB crea la mayor parte del código que necesitaría escribir para usted.

por supuesto, cuando solo quiero recuperar por un objeto, a menudo simplemente delego el hashcode e iguala los métodos a ese objeto (delegar igual podría ser problemático porque significaría que una de sus clases de "Titular de clave" sería igual al objeto que es su clave, pero eso se soluciona con bastante facilidad (y, de todos modos, no afectaría nada)

así que en la parte superior de mi cabeza:

class KeyHolder {
    public final String key;
    public final Object storeMe;

    public KeyHolder(String key, Object storeMe) {
        this.key=key;
        this.storeMe=storeMe;
    }

    public equals(Object o) {
        return (o instanceof KeyHolder && ((KeyHolder)o).key.equals(key));
    }

    public hashcode() {
        return key.hashCode();
    }
}

Eso es todo lo que hay que hacer, y eclipse hará los dos últimos por usted si así lo solicita.

Por cierto, sé que tengo miembros públicos, un miembro final público es exactamente lo mismo que tener un captador, no es realmente una idea terrible. Estoy comenzando a usar este patrón en clases de utilidad pequeñas como esta últimamente. Si el miembro no fuera definitivo, sería peor porque sería como tener un setter (algo que trato de evitar en estos días).

Respuesta: 6

Tengo que hacer una llamada SOAP desde mi programa java, para lo cual utilicé el eje apache. Mi programa es el siguiente: import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml ....

Estoy tratando de crear un JASPI ServerAuthModule personalizado totalmente aislado de mi aplicación EAR. Depende de una versión heredada de Spring Framework 2.5.5. Estoy ejecutando WildFly 9.0.2.Final. Definí un ...

Tengo ese objeto oracle: CREATE O REPLACE tipo employee_obj AS object (id NUMBER (10), ...) función de procedimiento almacenado get_employee_obj () return employee_obj es ...

Acabo de habilitar Session en mi aplicación Google AppEngine / Java + GWT. ¿Y cómo lo uso? ¿Cómo obtengo el ID de sesión y reproduzco todas las cosas buenas de él? ¿Hay ejemplos reales de inicio de sesión simple ...