Java и Python эквивалент PHP foreach ($ массив как $ ключ => $ значение) - PullRequest
15 голосов
/ 02 августа 2009

В php список имен состояний и их аббревиатур можно обработать с помощью ассоциативного массива, например:

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

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

Вывод (с сохранением порядка ключей):

The abbreviation for ALABAMA is AL.

The abbreviation for ALASKA is AK.

The abbreviation for WYOMING is WY.

РЕДАКТИРОВАТЬ: Обратите внимание, что порядок элементов массива сохраняется в выходных данных версии php. Реализация Java, использующая HashMap, не гарантирует порядок элементов. Также не словарь в Python.

Как это делается в Java и Python? Я нахожу только подходы, которые предоставляют значение, учитывая ключ, например, Python:

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

for key in stateDict:
    value = stateDict[key]

РЕДАКТИРОВАТЬ: на основе ответов, это было мое решение в Python,

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

for name, abbreviation in stateList:
    print name, abbreviation

Выход:

ALABAMA AL
ALASKA AK
WISCONSIN WI
WYOMING WY

Что именно и требовалось.

Ответы [ 8 ]

34 голосов
/ 02 августа 2009

в Python:

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

на Java:

Map<String,String> stateDict;

for (Map.Entry<String,String> e : stateDict.entrySet())
    System.out.println("The abbreviation for " + e.getKey() + " is " + e.getValue() + ".");
6 голосов
/ 02 августа 2009

в Java для использования ассоциативного массива 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()
            );
        }
    }
}
2 голосов
/ 03 августа 2009

Это модифицированный код из o948, где вы используете TreeMap вместо HashMap. Древовидная карта сохранит порядок ключей по ключу.

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()
            );
      }
    }
 }
2 голосов
/ 03 августа 2009

В Python упорядоченный словарь доступен в Python 2.7 (еще не выпущен) и Python 3.1. Это называется OrderedDict.

2 голосов
/ 02 августа 2009

Кроме того, для поддержания порядка вставки вы можете использовать LinkedHashMap вместо HashMap.

1 голос
/ 03 августа 2009

В соответствии с ответом Александра ...

Собственный словарь Python не поддерживает порядок для максимальной эффективности его основного использования: неупорядоченное отображение ключей на значения.

Я могу придумать два обходных пути:

  1. посмотрите на исходный код OrderedDict и включите его в вашу собственную программу.

  2. составить список, содержащий ключи в следующем порядке:

    states = ['Alabamba', 'Alaska', ...]  
    statesd = {'Alabamba':'AL', 'Alaska':'AK', ...}
    for k in states:
        print "The abbreviation for %s is %s." % (k, statesd[k])
    
1 голос
/ 02 августа 2009

Еще один способ сделать это на Java. Хотя лучший способ уже опубликован, этот синтаксически ближе к вашему php-коду.

for (String x:stateDict.keySet()){
        System.out.printf("The abbreviation for %s is %s\n",x,stateDict.get(x));
    }
0 голосов
/ 03 августа 2009

TreeMap не является ответом на ваш вопрос, потому что он сортирует элементы по ключу, в то время как LinkedHashMap сохраняет первоначальный порядок. Однако TreeMap больше подходит для словаря из-за сортировки.

...