fc2ブログ

ぼちぼち散歩

いろんな言語で連想配列を列挙

文字列操作の比較表: 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)

ページの先頭へ

トップページへ