phpのforeachに相当するjavaおよびpython($ array as $ key => $ value)
-
10-07-2019 - |
質問
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バージョンの出力で保持されることに注意してください。 HashMapを使用するJava実装は、要素の順序を保証しません。 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
正確に必要なもの。
解決
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() + ".");
他のヒント
連想配列の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()
);
}
}
}
また、挿入順序を維持するために、HashMapの代わりにLinkedHashMapを使用できます。
Pythonでは、順序付けられた辞書はPython 2.7で使用できます(まだリリースされています)およびPython 3.1。 OrderedDictと呼ばれます。
これは、HashMapの代わりにTreeMapを使用するo948から変更されたコードです。ツリーマップは、キーによるキーの順序を保持します。
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()
);
}
}
}
Javaで行う別の方法。より良い方法はすでに投稿されていますが、これは構文的にはPHPコードに近いものです。
for (String x:stateDict.keySet()){
System.out.printf("The abbreviation for %s is %s\n",x,stateDict.get(x));
}
アレキサンダーの答えに沿って...
ネイティブのpython辞書は、その主な使用法の最大効率のために順序を維持しません:キーの値への順序なしマッピング。
次の2つの回避策が考えられます。
-
OrderedDictのソースコードを見て、独自のプログラムに含めます。
-
キーを順番に保持するリストを作成します:
states = ['Alabamba', 'Alaska', ...] statesd = {'Alabamba':'AL', 'Alaska':'AK', ...} for k in states: print "The abbreviation for %s is %s." % (k, statesd[k])
TreeMapは要素をキーで並べ替えるのに対し、LinkedHashMapは元の順序を保持するため、質問への回答ではありません。ただし、ソートのため、TreeMapは辞書により適しています。