2012-02-13 21 views
8

Tengo que lograr un extraño y peculiar escenario. Su descrita de la siguiente manera:Mapas con múltiples tipos de valores en java

Tengo que diseñar un mapa donde las 'Claves ' son siempre de cadena tipo. Sin embargo, el 'Valor' para una de las claves puede ser un Cadena o una Lista (depende del número de valores que una clave en particular pueda tener. 'Valor' será una Cadena si esa clave en particular tiene un solo valor y tiene que ser una lista si la clave contiene muchos valores). ¿Cómo lograr este escenario?

Por ejemplo: hay 2 claves en un mapa llamado "Nombre" y "Números de teléfono". Una persona puede tener solo un nombre y múltiples números de teléfono. Así que aquí la primera clave, es decir, "Nombre" debe tener el tipo "Cadena" para el Valor, mientras que para la segunda clave, es decir, "Números de teléfono" debe tener el tipo "Lista" para el Valor. Cómo declarar tal mapa ¿Es posible?

+0

asignación de tareas Igual como: http://stackoverflow.com/questions/9259997/in-java-how-can-i-work-with-objects-which-can-be-either-string-or -liststring ??? –

Respuesta

13

Es posible hacer algo como Map<String, Object>.

Pero: recomiendo encarecidamente que se termine su diseño. Deberías usar una clase para tus personas en su lugar. De esa manera usted puede hacer: Map<String, Person> con Person teniendo captadores y ajustadores de nombres, números de teléfono y otra información.

Ejemplo clase Person:

public class Person { 

    private String name; 
    private List<String> phoneNumbers = Collections.emptyList(); 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setPhoneNumbers(List<String> phoneNumbers) { 
     this.phoneNumbers = phoneNumbers; 
    } 

    public void addPhoneNumber(String number) { 
     phoneNumbers.add(number); 
    } 

    public List<String> getPhoneNumbers() { 
     return phoneNumbers; 
    } 
} 
0

por qué no hacer una clase Fax envoltorio que expone una API para Söring uno o teléfono multipel números y luego puede recuperar uno o todos (múltiples) números de teléfono y luego hacer un mapa de String y PhoneNumber? Algo así como:

class PhoneNumber { 


    private String[] phoneNumbers; 


    public void storePhoneNumber(String... phoneNumbers) { 
    this.phoneNumbers = phoneNumbers; 
    } 

    public String getPhoneNumber() { 
    if(phoneNumbers.length>=1) { 
     return phoneNumbers[0]; 
    } else { 
     return null; 
    } 

    } 

    public List<String> getPhoneNumbers() { 
    if(phoneNumbers!=null) { 
     return Arrays.asList(phoneNumbers); 
    } else { 
     return null; 
    } 

    } 

}

2

Por supuesto que lo es. Elija su veneno:

Map<String, Object> mixed = new HashMap<String, Object>(); 

Map<String, Serializable> mixed = new HashMap<String, Serializable>(); 

@SuppressWarnings("rawtypes") 
Map mixed = new HashMap(); 
1

Bueno, ¿por qué no hacer un Map<String, List<String>>? siempre se puede simplemente añadir un elemento a la lista, si sólo hay un valor o utilice un supertipo común de la cadena y la lista, por lo que se obtendría

Map<String, Object> 
+0

Los usuarios piden una forma de utilizar esta estructura: '" Nombre "->" Sam Algo "," Números de teléfono "->" 1234 "," 5678 "' que aún no funcionan con su ejemplo. – nfechner

+2

'ListMultimap' de Guava es una mejor colección para usar en lugar de' Map > ' –

+0

@nfechner: ¿por qué no funcionaría?objeto puede ser cualquier cosa que se pueda representar en Java, ¿o me falta algo aquí? – bvanvelsen

1

lo haría uno de los siguientes:

  1. Utilice un Multimap<String, String>. El Multimap contendría uno o más valores asociados con cada clave.

  2. Utilice un Map<String, Either<String, List<String>>>. Use un Either para distinguir entre valores únicos o múltiples.

Cuestiones relacionadas