Question

En php, on peut gérer une liste de noms d’états et leurs abréviations avec un tableau associatif comme celui-ci:

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

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

Sortie (avec l'ordre des clés préservé):

The abbreviation for ALABAMA is AL.

The abbreviation for ALASKA is AK.

The abbreviation for WYOMING is WY.

EDIT: Notez que l'ordre des éléments du tableau est préservé dans la sortie de la version php. L'implémentation Java, à l'aide d'un HashMap, ne garantit pas l'ordre des éléments. Le dictionnaire en python non plus.

Comment cela se fait-il en java et en python? Je ne trouve que des approches qui fournissent la valeur, compte tenu de la clé, comme celle de python:

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

for key in stateDict:
    value = stateDict[key]

EDIT: sur la base des réponses, c’était ma solution en python,

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

for name, abbreviation in stateList:
    print name, abbreviation

Sortie:

ALABAMA AL
ALASKA AK
WISCONSIN WI
WYOMING WY

Ce qui correspond exactement à ce qui était requis.

Était-ce utile?

La solution

en Python:

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

en Java:

Map<String,String> stateDict;

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

Autres conseils

en Java pour l'utilisation de tableaux associatifs Carte

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()
            );
        }
    }
}

De plus, pour conserver l'ordre d'insertion, vous pouvez utiliser un LinkedHashMap au lieu d'un HashMap.

En python, un dictionnaire commandé est disponible dans Python 2.7 encore publié) et Python 3.1. Il s’appelle OrderedDict.

Il s'agit du code modifié à partir de o948 dans lequel vous utilisez un TreeMap au lieu d'un HashMap. La arborescence préservera l’ordre des clés par clé.

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()
            );
      }
    }
 }

Une autre façon de le faire en Java. Même si un meilleur moyen a déjà été affiché, celui-ci est plus proche de votre code php sur le plan syntaxique.

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

Dans le sens de la réponse d'Alexandre ...

Le dictionnaire python natif ne maintient pas l'ordre pour une efficacité maximale de son utilisation principale: un mappage non ordonné de clés en valeurs.

Je peux penser à deux solutions de contournement:

  1. regardez le code source de OrderedDict et incluez-le dans votre propre programme.

  2. créez une liste contenant les clés dans l'ordre:

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

TreeMap n'est pas une réponse à votre question car il trie les éléments par clé, tandis que LinkedHashMap conserve l'ordre d'origine. Cependant, TreeMap convient mieux au dictionnaire à cause du tri.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top