2012-02-13 3 views
8

Devo realizzare uno strano scenario particolare. La sua descritto come segue:Mappe con più tipi di valori in java

devo disegnare una mappa in cui i 'chiavi' sono sempre di String tipo. Tuttavia, il valore "" "per una chiave può essere una stringa o un elenco (dipende dal numero di valori che una particolare chiave può avere." Valore "sarà una stringa se quella particolare chiave ha un solo valore e deve essere una lista se la chiave contiene molti valori). Come realizzare questo scenario?

Ad esempio: ci sono 2 chiavi in ​​una mappa vale a dire "Nome" e "Numero di telefono". Una persona può avere un solo nome e più numeri di telefono. Quindi, ecco la prima chiave in cui "Nome" dovrebbe avere il tipo "Stringa" per Valore, mentre per la seconda chiave, ad esempio "Numero telefono", dovrebbe avere il tipo "Elenco" per Valore. Come dichiarare una mappa del genere. È possibile?

+0

Stesso compito a casa come: http://stackoverflow.com/questions/9259997/in-java-how-can-i-work-with-objects-which-can-be-either-string-or -liststring ??? –

risposta

13

È possibile fare qualcosa come Map<String, Object>.

Ma: Consiglio vivamente di pensare al tuo progetto. Dovresti invece usare un corso per le tue persone. In questo modo puoi: Map<String, Person> con Person con getter e setter per nomi, numeri di telefono e altre informazioni.

Esempio Person classe:

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

Perché non fare una classe PhoneNumber wrapper che espone un'API per soring uno o telefono multipel numeri e poi in grado di recuperare uno o tutti (più) i numeri di telefono e poi fare una mappa di String e PhoneNumber? Qualcosa di simile:

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

Certo che c'è. Scegli il tuo veleno:

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

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

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

Bene, perché non fare un Map<String, List<String>>? si può sempre e solo di aggiungere un elemento alla lista se c'è un solo valore o si utilizza un supertipo comune String e List, in tal modo si otterrebbe

Map<String, Object> 
+0

Gli utenti chiedono un modo per utilizzare questa struttura: '" Nome "->" Sam qualcosa "," Numero di telefono "->" 1234 "," 5678 "' che ancora non funzioneranno con il tuo esempio. – nfechner

+2

'ListMultimap' di Guava è una raccolta migliore da usare piuttosto che' Mappa > ' –

+0

@nfechner: perché non dovrebbe funzionare?l'oggetto può essere tutto ciò che può essere rappresentato in java, o mi manca qualcosa qui? – bvanvelsen

1

Vorrei fare uno dei seguenti modi:

  1. Utilizzare un Multimap<String, String>. Lo Multimap conterrebbe uno o più valori associati a ciascuna chiave.

  2. Utilizzare un Map<String, Either<String, List<String>>>. Utilizzare un Either per distinguere tra uno o più valori.