いろんな言語で連想配列を列挙
文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++が面白かったのでマネしてわかる範囲でいろいろやってみた.
目次
Ruby
コード
hash = { "key1" => "value1", "key2" => "value2", "key3" => "value3" } hash.each() {|value, key| print value + " : " + key + "\n" }
実行結果
key1 : value1 key2 : value2 key3 : value3
Rubyはすべてがオブジェクトなので,配列もArrayクラスのインスタンスということになってる.で,eachメソッドにコードブロックを引数として与えることでイテレートできる.楽しい.
PHP
コード
<?php $hash = array( "key1" => "value1", "key2" => "value2", "key3" => "value3" ); // 普通 foreach($hash as $key => $value) { print $key . " : " . $value . "\n"; } // 変 array_walk($hash, create_function('$value, $key', ' print $key . " : " . $value . "\n"; ')); ?>
実行結果
key1 : value1 key2 : value2 key3 : value3
普通はforeachで回すけど,array_walkと匿名関数を作るcreate_functionで書くこともできる.
JavaScript
コード
var hash = { "key1": "value1", "key2": "value2", "key3": "value3" }; // 普通 for(var key in hash) { document.write(key + " : " + hash[key] + "\n"); } // 変 Object.prototype.each = function(iterator) { for(var key in this) { if(this.hasOwnProperty(key)) iterator(this[key], key); } }; hash.each(function(value, key) { document.write(key + " : " + value + "\n"); });
実行結果
key1 : value1 key2 : value2 key3 : value3
for in構文を使うのがわかりやすい.JavaScriptは全てがオブジェクトで連想配列はObjectオブジェクト(なんか変)なのでprototypeにメソッドをくっつければどうとでも書ける.
Python
コード
hash = { "key1": "value1", "key2": "value2", "key3": "value3" } for key, value in hash.iteritems(): print key + " : " + value
実行結果
key3 : value3 key2 : value2 key1 : value1
はじめてPython書いてみた.配列オブジェクトがイテレータを返してくれる感じ?
C++
コード
#include <iostream> #include <map> using namespace std; void iteratorFunction(const pair<char *, char *> &value) { cout << value.first << " : " << value.second << endl; } int main() { map<char *, char *> array; array.insert(pair<char *, char *>("key1", "value1")); array.insert(pair<char *, char *>("key2", "value2")); array.insert(pair<char *, char *>("key3", "value3")); for_each(array.begin(), array.end(), iteratorFunction); return 0; }
実行結果
key1 : value1 key2 : value2 key3 : value3
C++はよく使うけど,はじめてstd::mapとかfor_eachとか使った.テンプレート使うとどうしても見た目がゴチャゴチャになるけどテンプレートは面白いので使いこなしてみたい.
Java
コード
import java.util.Hashtable; import java.util.Enumeration; public class Hash { public static void main(String args[]) { Hashtable hash = new Hashtable(); hash.put("key1", "value1"); hash.put("key2", "value2"); hash.put("key3", "value3"); Enumeration e = hash.keys(); while(e.hasMoreElements()) { String key = (String)e.nextElement(); System.out.println(key + " : " + hash.get(key)); } } }
実行結果
key3 : value3 key2 : value2 key1 : value1
久しぶりにJavaのコードを書いた.といっても全然経験ないので,はじめてjava.util.Hashtable使ったような感じ.
Objective-C + Cocoa
コード
#import <Foundation/Foundation.h> #import <stdio.h> int main() { id pool = [[NSAutoreleasePool alloc] init]; id keys[] = { @"key1", @"key2", @"key3" }; id values[] = { @"value1", @"value2", @"value3" }; id hash = [[NSDictionary alloc] initWithObjects:values forKeys:keys count:3]; id key; NSEnumerator *enumerator = [hash keyEnumerator]; while((key = [enumerator nextObject]) != nil) { printf("%s : %s\n", [key cString], [[hash objectForKey:key] cString]); } [hash release]; [pool release]; return 0; }
実行結果
key2 : value2 key3 : value3 key1 : value1
Objective-Cは勉強中で,はじめてNSDictionary使った.なんとなくJavaと似てるのはJavaがObjective-Cの影響を受けているからとういことでいいのかな?.
まとめ
個人的にはRubyが一番美しいというか,やりたいことが直感的にわかるコードになっていると思う.スクリプト系に比べてコンパイル系がどうしてもコードが長くなるのは仕方ないにしてもJavaがすっきりしていて良いと思った.Objective-CもMac OS X 10.5でガベージコレクタが採用されるらしいのでそしたらNSAutoreleasePoolとかreleaseとかがなくなるのでシンプルになると思う.
2006/10/26 09:40 | Programming | トラックバック(0) | コメント(0)