Esiste un nome per un dizionario che restituisce la chiave come valore predefinito? [chiuso]

2

Un dizionario che restituisce la chiave poiché il valore di default può essere utilizzato nei casi in cui sono necessarie eccezioni o traduzioni.

es. Si potrebbe fare

i18n = SpecialDict()

if spanish:
    i18n["Hello"] = "Hola"

print(i18n["Test"]) # prints Test
print(i18n["Hello"]) # prints Hola if spanish

I18n è solo un esempio, ci sono altri (probabilmente migliori) usi.

Esiste un nome per questo dizionario / modello?

Modifica

Wow, non mi aspettavo un backsplash di questo tipo. Giusto per chiarire, questo tipo di dizionario non è "difettoso" o "rotto". È una soluzione semplice ed elegante per un tipo specifico di problema, e ho usato questo modello con grande successo nella mia carriera. Se non riesci a vedere un utilizzo per questo, passa ad un'altra domanda.

Per quanto riguarda il commento di gnat, non ero a conoscenza del fatto che domande come questa non fossero benvenute qui. Mi dispiace per questo. Vorrei eliminare la mia domanda ma c'è già una risposta (che in realtà non risponde alla mia domanda) quindi la contrassegnerò solo per la chiusura.

Modifica 2

Dal momento che non ho trovato un nome o un utilizzo di questo, e questa domanda (purtroppo di breve durata) non ha sollevato nulla o con questo nome cito questo modello

Aspetto dei dati

e l'oggetto simile al dizionario a

Mappa degli aspetti dei dati

Mi piacerebbe pubblicare una risposta a questa domanda con una definizione più dettagliata, una descrizione e magari alcuni esempi e un feedback positivo a questo schema, ma non posso, poiché questa domanda è in attesa.

    
posta Fozi 25.02.2015 - 17:14
fonte

2 risposte

5

Per il caso d'uso che hai descritto, penso che sia un modello valido. Tuttavia, non esiste un nome per questo, AFAIK .

In Java 8, c'è un Map.getOrDefault , che quasi fa questo:

String greetingKey = "Hello";

Map<String, String> i18n = new HashMap<>();
i18n.put(greetingKey, "Hola");

String greeting = i18n.getOrDefault(greetingKey, greetingKey);

Semplicemente usando una chiave come valore predefinito - un po 'più verbosa della tua versione, se è stata implementata come una classe con metodo get sostituito.

C'è un modello più generale a questo: "se non c'è un valore per una chiave richiesta, restituisci il risultato di qualche funzione applicata a una chiave (e altri dati in una mappa / dizionario)" - nel tuo caso è solo un < a href="http://en.wikipedia.org/wiki/Identity_function"> funzione identità applicata a una chiave. Lo stesso modello può essere utilizzato per interpolazione , ad esempio.

Può essere chiamato "mappa interpolata", dove nel tuo caso l'interpolazione è degenerata per usare solo una chiave (argomento) e nessun "punto prossimo" (confronta: l'interpolazione lineare usa due vicini). Tuttavia, non ho mai sentito dire che una cosa del genere sia un modello orientato agli oggetti. È più di un modello di progettazione funzionale , che utilizza solo le funzioni di ordine superiore , quindi non è necessario alcun nome specifico.

EDIT : il tuo approccio può essere considerato errato perché esiste un contratto implicito sulla mappa / dizionario, che afferma: "se containsKey restituisce false , quindi get deve restituire null "(l'opposto potrebbe non valere se null è un valore valido).

Probabilmente esiste un codice che si basa su questo contratto e la tua implementazione lo spezza, quindi potrebbe causare errori di runtime.

    
risposta data 25.02.2015 - 19:32
fonte
1

Questo non suona come qualsiasi classe di dizionario che ho sentito, ma potrebbe essere banalmente implementato avvolgendo un dizionario in un'altra classe (o ereditando da esso) e modificando il comportamento Get.

    
risposta data 25.02.2015 - 17:17
fonte

Leggi altre domande sui tag