なんちゃってArrayList
PHPの勉強をしていて、配列絡みの関数とかが多いし
なんか独特な名称なので動作の確認とかをかねて
JavaのArrayListクラスを書いてみた。
とはいえJavaの実装と同じにしたわけでない。
勉強がてらなので実用性は低い。パフォーマンスも
クラス生成したりメソッド呼んだりしてる分遅いだろうし
なによりもしょっぱいソースに仕上がっている。
インスタンスのサイズいじったりする独特なメソッドと
cloneははずした。
基本的には、同じような機能の関数を呼び出しているだけ。
PHPにオーバーロードがない時点でやめときゃよかった。
<?php /***************************************************************** * JavaのArrayListクラスを無理やりPHPで。 *****************************************************************/ class ArrayList { private $ary = array(); /***************************************************************** * コンストラクタ *****************************************************************/ function __construct() { $args = func_get_args(); if($args) { $this->ary = $args; } } /***************************************************************** * リストの指定された位置に、指定された要素を挿入します。 *****************************************************************/ function add(/* (index), element */) { $args = func_get_args(); if(count($args) == 1) { $this->ary[] = $args[0]; } else { if(is_int($args[0])) { array_splice($this->ary, $args[0], 0, $args[1]); } } } /***************************************************************** * リスト内の指定された位置から、 * 指定された arrayのすべての要素を挿入します。 *****************************************************************/ function addAll(/* (index), array */) { $args = func_get_args(); $ret = false; if(count($args) == 1) { $this->ary = array_merge($this->ary, $args[0]); $ret = true; } else { if(is_int($args[0])) { array_splice($this->ary, $args[0], 0, $args[1]); $ret = true; } } return $ret; } /***************************************************************** * リストからすべての要素を削除します。 *****************************************************************/ function clear() { $this->ary = array(); } /***************************************************************** * リストに指定された要素がある場合に true を返します。 *****************************************************************/ function contains($elem) { return in_array($elem, $this->ary); } /***************************************************************** * リスト内の指定された位置にある要素を返します。 *****************************************************************/ function get($index) { return $this->ary[$index]; } /***************************************************************** * 指定された引数と同じ内容の要素を先頭から検索します。 *****************************************************************/ function indexOf($elem) { $index = array_search($elem, $this->ary); return $index == "" ? -1 : $index; } /***************************************************************** * 指定された引数と同じ内容の要素を先頭から検索します。 *****************************************************************/ function isEmpty() { return empty($this->ary); } /***************************************************************** * 指定されたオブジェクトがリスト内で最後に現れるインデックスを返します。 *****************************************************************/ function lastIndexOf($elem) { $rev = array_reverse($this->ary); $index = array_search($elem, $rev); return $index == "" ? -1 : (count($rev) -1) - $index; } /***************************************************************** * リスト内の指定された位置から要素を削除します。 *****************************************************************/ function remove($arg) {//indexのばあいと要素の場合 $index = is_int($arg) ? $arg : $this->indexOf($arg); $ret = $this->ary[$index]; array_splice($this->ary, $index, 1); return $ret; } /***************************************************************** * fromIndex に始まり toIndex の直前までのインデックスを持つ * すべての要素を削除します。 *****************************************************************/ function removeRange($fromIndex = 0, $toIndex = 0) { $len = $toIndex - $fromIndex; array_splice($this->ary, $fromIndex, $len); } /***************************************************************** * リストの指定された位置にある要素を、指定された要素で置き換えます。 *****************************************************************/ function set($index, $element) { $ret = $this->ary[$index]; $this->ary[$index] = $element; return $ret; } /***************************************************************** * リスト内にある要素の数を返します。 *****************************************************************/ function size() { return count($this->ary); } /***************************************************************** * リスト内のすべての要素が正しい順序で格納されている配列を返します。 *****************************************************************/ function toArray() { return $this->ary; } } ?>
lastIndexOfはかなりしょっぱい気がする。
この方法か、配列の後ろからとりだして比較していく
方法くらいしか思いつかなかった。
どうなんだろ。