2

多くの双方向マップ (グアバの BiMap ) を使用する Java コードを PHP に移植しています。Java のようなマップは PHP 配列またはSplObjectStorageによって提供されますが、ライブラリ PHP Bi-Directional マップを利用できますか?

4

2 に答える 2

2

このクラスは、双方向マップのほとんどのニーズに対応する必要があります。

class BiMap
{

    private $KtoV, $VtoK;

    public function __constructor()
    {
        $this->KtoV = []; // for version < 5.4.0, syntax must be: $this->KtoV = array();
        $this->VtoK = [];
    }

    public function getKey($v)
    {
        if($this->hasValue($v))
        {
            return $this->VtoK[$v];
        }
        else
        {
            return null;
        }
    }

    public function getAllKeys()
    {
        if($this->KtoV)
        {
            return array_keys($this->KtoV);
        }
        else
        {
            return $this->KtoV;
        }
    }

    public function getValue($k)
    {
        if($this->hasKey($k))
        {
            return $this->KtoV[$k];
        }
        else
        {
            return null;
        }
    }

    public function getAllValues()
    {
        if($this->VtoK)
        {
            return array_keys($this->VtoK);
        }
        else
        {
            return $this->VtoK;
        }
    }

    public function hasKey($k)
    {
        return isset($this->KtoV[$k]);
    }

    public function hasValue($v)
    {
        return isset($this->VtoK[$v]);
    }

    public function put($k, $v)
    {
        if($this->hasKey($k))
        {
            $this->removeKey($k);
        }
        if($this->hasValue($v))
        {
            $this->removeValue($v);
        }
        $this->KtoV[$k] = $v;
        $this->VtoK[$v] = $k;
    }

    public function putAll($array)
    {
        foreach($array as $k => $v)
        {
            $this->put($k, $v);
        }
    }

    public function removeKey($k)
    {
        if($this->hasKey($k))
        {
            unset($this->VtoK[$this->KtoV[$k]]);
            $v = $this->KtoV[$k];
            unset($this->KtoV[$k]);
            return $v;
        }
        else
        {
            return null;
        }
    }

    public function removeValue($v)
    {
        if($this->hasValue($v))
        {
            unset($this->KtoV[$this->VtoK[$v]]);
            $k = $this->VtoK[$v];
            unset($this->VtoK[$v]);
            return $k;
        }
        else
        {
            return null;
        }
    }

}

ただし、キー/値の null チェックおよび/またはオブジェクト/配列チェックが必要な場合は、次のコード行と同様の処理を関数の本体で指定しhasKey($k)hasValue($v)およびput($k, $v)メソッド内で適切に呼び出す必要があります。

    if($item === null)
    {
        throw new Exception('null as BiMap key / value is invalid.');
    }
    if(is_object($item) || is_array($item))
    {
        throw new Exception('Object / Array as BiMap key / value is invalid.');
    }
于 2013-10-08T10:53:18.610 に答える