2009-08-02 9 views
12

w PHP, można obsługiwać listę nazw państwowych i ich skrótów z tablicy asocjacyjnej jak ten:

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

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

Output (z zachowanym kluczem):

The abbreviation for ALABAMA is AL. 

The abbreviation for ALASKA is AK. 

The abbreviation for WYOMING is WY. 

EDYCJA: Zwróć uwagę, że kolejność elementów tablicy jest zachowana na wyjściu wersji php. Implementacja Java, wykorzystująca HashMap, nie gwarantuje kolejności elementów. Ani słownik w Pythonie.

Jak to zrobić w Javie i Pythonie? I tylko znalezienie rozwiązań, które dostarczają wartość, biorąc pod klucz, jak Pythona:

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

for key in stateDict: 
    value = stateDict[key] 

EDIT: na podstawie odpowiedzi, to było moje rozwiązanie w Pythonie,

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

for name, abbreviation in stateList: 
    print name, abbreviation 

wyjściowa:

ALABAMA AL 
ALASKA AK 
WISCONSIN WI 
WYOMING WY 

Dokładnie to, co było wymagane.

+0

Dlaczego mówisz, że "* liczba elementów tablicy PHP jest zachowana w wynikach" *? Czy to zachowanie ** jest gwarantowane ** przez dokumenty PHP? – Pacerier

Odpowiedz

32

w Pythonie:

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

w Javie:

Map<String,String> stateDict; 

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

Dziękuję bardzo za pomoc. Jeśli chodzi o wersję Java, uważam, że May.Entry jest po prostu błędnie napisane. Może to być naprawdę mylące dla początkującego kodu sortującego, gdy ma nawet małą literówkę. Czy można bezpiecznie założyć, że stateDict jest w rzeczywistości mapą? A HashMap? –

+0

thanx, poprawiono. stateDict jest mapą – newacct

+0

Zmieniłem moje pytanie, aby podkreślić, że kolejność elementów tablicy jest zachowana w wynikach wersji php. Implementacja Java przy użyciu mapy nie wydaje się gwarantować kolejność elementów. –

6

w Java dla asocjacyjna Use Map

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

Dzięki za wyraźny przykład! I kompiluje i działa, robi dokładnie to, czego się spodziewałem. Twoja odpowiedź pomogła mi uporządkować skróconą wersję newacct. Szczerze mówiąc, bez twojego kodu straciłbym trochę czasu. –

+0

Ups, zauważony po tym, że HashMap nie zachowuje porządku elementów. Ale robi to LinkedHashMap! –

+0

@ o948 dziękuję za ten jeden –

1

Kolejny sposób to zrobić w Javie. Mimo że lepszy sposób został już opublikowany, ten jest syntaktycznie bliższy twojemu kodowi php.

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

To wygląda interesująco, i działa dobrze, ale przyznaję, że zajmie mi to chwilę, aby to rozwiązać! :) Dzięki za przykład. –

2

Ponadto, aby utrzymać porządek wstawiania można użyć zamiast LinkedHashMap HashMap.

+0

Tak, LinkedHashMap wygląda dokładnie tak, jak potrzebowałem. Skompilowane, uruchomione i zamówienie jest zachowane. To za wskazówkę! –

+0

Twoja sugestia rozwiązała wersję Java, czy możesz polecić zastąpienie słownika w wersji pythona acct? To nie zachowuje porządku albo ... –

2

W python i ordered dictionary jest dostępny w Pythonie 2.7 (jeszcze nie wydany) i Python 3.1. Nazywa się OrderedDict.

+0

Dzięki za napiwek! Zaczynałem myśleć, że moje pytanie może pozostać bez odpowiedzi. Przyznam jednak, że jestem zestresowany, jeśli prawdą jest, że foreach php ($ array jako $ key => $ value) nie może być zaimplementowane w pythonie. Obawiam się, że nie rozumiem, dlaczego słownik uporządkowanych kluczy musi utracić swoją kolejność po pobraniu. To kłopotliwe. Teraz przypuszczam, że szukam obejścia. –

+0

@Lasoldo Solsifa: kiedy mówisz "słownik uporządkowanych kluczy", masz na myśli instancję OrderedDict lub normalny Dict Pythona? Ponieważ normalny kod Pythona NIGDY nie zamówił kluczy - specyfikacja mówi, że klucze mogą być zwrócone w dowolnej kolejności. Różnica polega na tym, że PHP faktycznie używa tablicy asocjacyjnej, a Python używa tablicy hashtable. Są podobne, ale nie do końca takie same. W Pythonie <= 2.6, używanie listy 2-krotnej jest prawdopodobnie lepszym rozwiązaniem. –

+0

Nie znając Pythona, znałem pierwszy z nadchodzącego uporządkowanego słownika z odpowiedzi Aleksandra Ljungberga na moje pytanie. Poszukuję tylko ogólnie tablicy asocjacyjnej, z której mogę pobierać klucze w kolejności, w jakiej zostały wstawione. Przyjrzę się twoją sugestią listy 2-tek. Dzięki za pomoc. –

2

Jest to zmodyfikowany kod z o948, w którym używa się mapy drzewa zamiast mapy HashMap. Mapa drzewa zachowa porządek klawiszy za pomocą klawisza.

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

Dzięki za pomoc. Pytanie wskazało również, że LinkedHashMap zachowałoby kolejność elementów, więc zrobiłem to samo, tylko ja podjąłem LinkedHashMap dla HashMap, Wasza również działa, więc teraz mogę wybrać jedno z dwóch rozwiązań: –

+0

Ups. Pilgrim wskazuje, że TreeMap sortuje elementy według klucza , podczas gdy LinkedHashMap zachowuje pierwotną kolejność, która jest wymagana. –

1

Wzorując się odpowiedzi Aleksandra ...

Natywna słowniku pyton nie utrzymuje zamawiania dla maksymalnej wydajności swojego pierwotnego użytku: nieuporządkowanym odwzorowania kluczy do wartości.

mogę myśleć dwa obejścia:

  1. spojrzenie na kodzie źródłowym OrderedDict i umieścić go w swoim programie.

  2. zrobić listę, która posiada klucze w celu:

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

Sugestia Daniela Pryden'a dotycząca listy dwójek może być lepsza. np. [("Alabamba", "AL"), ("Alaska", "AK"), ...] – alberge

0

TreeMap nie jest odpowiedź na pytanie, ponieważ sortuje elementy według klucza, natomiast LinkedHashMap zachowuje oryginalnej kolejności. Jednak TreeMap jest bardziej odpowiedni dla słownika z powodu sortowania.

+0

Dziękuję bardzo za wskazanie tego. Ponieważ moja lista stanów w USA jest w przeważającej części w porządku alfabetycznym, nie zauważyłem, że TreeMap rzeczywiście sortuje elementy! Przetestowałem to i na pewno nie zachowało to zamówienia reklamowego. W przeciwieństwie do LinkedHashMap, który pozostaje zwycięzcą w tym przypadku. –