2009-08-02 6 views
12

in PHP, si può gestire una lista di nomi di stato e le loro abbreviazioni un array associativo in questo modo:

<?php 
    $stateArray = array(
     "ALABAMA"=>"AL", 
     "ALASKA"=>"AK", 
     // etc... 
     "WYOMING"=>"WY" 
    ); 

    foreach ($stateArray as $stateName => $stateAbbreviation){ 
     print "The abbreviation for $stateName is $stateAbbreviation.\n\n"; 
    } 
?> 

uscita (con ordine chiave conservato):

The abbreviation for ALABAMA is AL. 

The abbreviation for ALASKA is AK. 

The abbreviation for WYOMING is WY. 

EDIT: si noti che l'ordine degli elementi dell'array è conservato nella uscita della versione php. L'implementazione Java, utilizzando una HashMap, non garantisce l'ordine degli elementi. Né il dizionario in Python.

Come è fatto in java e python? Trovo solo approcci che forniscono il valore, data la chiave, come il pitone di:

stateDict = { 
    "ALASKA": "AK", 
    "WYOMING": "WY", 
} 

for key in stateDict: 
    value = stateDict[key] 

EDIT: sulla base delle risposte, questa è stata la mia soluzione in python,

# a list of two-tuples 
stateList = [ 
    ('ALABAMA', 'AL'), 
    ('ALASKA', 'AK'), 
    ('WISCONSIN', 'WI'), 
    ('WYOMING', 'WY'), 
] 

for name, abbreviation in stateList: 
    print name, abbreviation 

uscita:

ALABAMA AL 
ALASKA AK 
WISCONSIN WI 
WYOMING WY 

Quale è esattamente ciò che è stato richiesto.

+0

Perché dici che l'ordine di * * di elementi di matrice di PHP è conservato nell'output "*? Questo comportamento è ** garantito ** dai documenti PHP? – Pacerier

risposta

32

in Python:

for key, value in stateDict.items(): # .iteritems() in Python 2.x 
    print "The abbreviation for %s is %s." % (key, value) 

in Java:

Map<String,String> stateDict; 

for (Map.Entry<String,String> e : stateDict.entrySet()) 
    System.out.println("The abbreviation for " + e.getKey() + " is " + e.getValue() + "."); 
+0

Grazie mille per il vostro aiuto. Per quanto riguarda la versione Java, do per scontato che May.Entry sia semplicemente errato. Può essere davvero confuso per un novizio che ordina il codice quando ha anche un piccolo refuso in esso. È sicuro assumere che stateDict sia in realtà una mappa? Una HashMap? –

+0

Grazie, risolto. stateDict è una mappa – newacct

+0

Ho modificato la mia domanda per sottolineare che l'ordine degli elementi dell'array è conservato nell'output della versione php. L'implementazione Java, utilizzando una mappa, non sembra garantire l'ordine degli elementi. –

6

in java per array associativo uso Mappa

import java.util.*; 

class Foo 
{ 
    public static void main(String[] args) 
    { 
     Map<String, String> stateMap = new HashMap<String, String>(); 
     stateMap.put("ALABAMA", "AL"); 
     stateMap.put("ALASKA", "AK"); 
     // ... 
     stateMap.put("WYOMING", "WY"); 

     for (Map.Entry<String, String> state : stateMap.entrySet()) { 
      System.out.printf(
       "The abbreviation for %s is %s%n", 
       state.getKey(), 
       state.getValue() 
      ); 
     } 
    } 
} 
+0

Grazie per il chiaro esempio! E compila e corre, fa proprio quello che mi aspettavo. La tua risposta mi ha aiutato a risolvere la versione abbreviata di newacct. Francamente, senza il tuo codice, sarei stato perso per un bel po '. –

+0

Oops, notato dopo il fatto che HashMap non conserva l'ordine degli elementi. Ma una LinkedHashMap fa! –

+0

@ o948 grazie per questo uno –

1

Un altro modo di farlo in Java. Sebbene sia già stato pubblicato un modo migliore, questo è sinteticamente più vicino al tuo codice php.

for (String x:stateDict.keySet()){ 
     System.out.printf("The abbreviation for %s is %s\n",x,stateDict.get(x)); 
    } 
+0

Questo sembra interessante, e funziona bene, ma ammetto che mi ci vorrà un momento per risolverlo! :) Grazie per l'esempio. –

2

Inoltre, per mantenere l'ordine di inserimento, è possibile utilizzare una LinkedHashMap anziché una HashMap.

+0

Sì, una LinkedHashMap sembra esattamente ciò di cui avevo bisogno. Compilato, eseguito e l'ordine è preservato. Questo è per la punta! –

+0

Il tuo suggerimento ha risolto la versione di Java, puoi raccomandare una sostituzione per il dizionario nella versione python di acct? Non conserva l'ordine ... –

2

In python uno ordered dictionary è disponibile in Python 2.7 (non ancora rilasciato) e Python 3.1. Si chiama OrderedDict.

+0

Grazie per il suggerimento! Stavo iniziando a pensare che la mia domanda potesse rimanere senza risposta. Ammetto che sono angosciato, tuttavia, se è vero che foreach di php ($ array come $ key => $ valore) non può essere implementato in python. Temo di non capire perché un dizionario di chiavi ordinate debba perdere il suo ordine quando viene recuperato. È perplesso. Ora suppongo di essere alla ricerca di un work-around. –

+0

@Lasoldo Solsifa: quando dici "un dizionario di chiavi ordinate" intendi un'istanza di OrderedDict o un normale ditt di Python? Poiché un normale Python diceva che MAI non ha ordinato le chiavi, la specifica dice che le chiavi possono essere restituite in qualsiasi ordine. La differenza è che PHP usa effettivamente un array associativo e Python usa un hashtable. Sono simili ma non esattamente uguali. In Python <= 2.6, l'uso di un elenco di tuple da 2 è probabilmente la soluzione migliore. –

+0

Non conoscendo Python, conoscevo il suo primo dizionario ordinato dalla risposta di Alexander Ljungberg alla mia domanda. Sto solo cercando un array associativo in generale, dal quale posso recuperare le mie chiavi nell'ordine in cui sono state inserite. Osserverò il tuo suggerimento di un elenco di 2 tuple. Grazie per l'aiuto. –

2

Questo è il codice modificato da o948 in cui si utilizza una TreeMap anziché una HashMap. La mappa ad albero manterrà l'ordine delle chiavi tramite la chiave.

import java.util.*; 

class Foo 
{ 
public static void main(String[] args) 
{ 
    Map<String, String> stateMap = new TreeMap<String, String>(); 
    stateMap.put("ALABAMA", "AL"); 
    stateMap.put("ALASKA", "AK"); 
    // ... 
    stateMap.put("WYOMING", "WY"); 

    for (Map.Entry<String, String> state : stateMap.entrySet()) { 
      System.out.printf(
        "The abbreviation for %s is %s%n", 
        state.getKey(), 
        state.getValue() 
      ); 
     } 
    } 
} 
+1

Grazie per l'aiuto. la domanda indicava anche che LinkedHashMap avrebbe preservato l'ordine degli elementi, quindi mi piaceva, solo io ho sostituito LinkedHashMap per HashMap. Anche il tuo funziona, quindi ora posso scegliere tra due soluzioni! –

+0

Oops. Pilgrim fa notare che TreeMap ordina gli elementi per chiave , mentre LinkedHashMap conserva l'ordine originale, che è quello che era richiesto –

1

Lungo le linee di risposta di Alexander ...

Il dizionario Python nativo non mantiene l'ordinazione per la massima efficienza del suo uso primario: una mappatura non ordinata delle chiavi ai valori.

Mi vengono in mente due soluzioni:

  1. un'occhiata al codice sorgente di OrderedDict e includerlo nel proprio programma.

  2. fare una lista che contiene le chiavi per:

    states = ['Alabamba', 'Alaska', ...] 
    statesd = {'Alabamba':'AL', 'Alaska':'AK', ...} 
    for k in states: 
        print "The abbreviation for %s is %s." % (k, statesd[k]) 
    
+0

Il suggerimento di Daniel Pryden di un elenco di due tuple potrebbe essere migliore. ad es. [('Alabamba', 'AL'), ('Alaska', 'AK'), ...] – alberge

0

TreeMap non è una risposta alla tua domanda, perché ordina gli elementi di chiave, mentre LinkedHashMap conserva ordine originale. Tuttavia, TreeMap è più adatto al dizionario a causa dell'ordinamento.

+0

Grazie mille per averlo indicato. Dato che la mia lista di stati americani è, per la maggior parte, in ordine alfabetico, non ho notato che TreeMap stava effettivamente selezionando gli elementi! L'ho provato, e abbastanza sicuro, non ha conservato l'ordine di inserimento. A differenza di LinkedHashMap, che rimane il vincitore in questo caso. –

Problemi correlati