ソート順に進む必要があるオブジェクトがたくさんあります。 SplHeap、SplMaxHeap、SplMinHeapの2つのサブクラスが見つかりましたので、私はそれらを実験として使用しようと考えていました。コメントでは、SplPriorityQueuementionedも読んでいます。SplHeap、SplMinHeap、SplMaxHeap、SplPriorityQueueの相違点
しかし、それらを試した後、3つのヒープの違いは何か、そしてヒープとキューの選択方法はちょっと分かりません。ここで
は、すべてのオブジェクトを名前で並べ替えられますことを、「4」クラスですforeach
ループが正しく内のオブジェクトを一覧表示されます。すなわち、最初から最後まで順番を並べ替え:
class SortedObjectHeap extends SplHeap|SplMinHeap|SplMaxHeap
{
protected $_property;
public function __construct(string $property)
{
$this->_property = $property;
}
protected function compare($x, $y)
{
$x = $x->{$this->_property} ?? null;
$y = $y->{$this->_property} ?? null;
return strnatcasecmp($x, $y) * -1;
}
}
$list = new SortedObjectHeap('name');
$list->insert($object);
// ...
class SortedObjectQueue extends SplPriorityQueue
{
public function compare($x, $y)
{
return strnatcasecmp($x, $y) * -1;
}
}
$list = new SortedObjectQueue();
$list->insert($object, $object->name);
// ...
質問:
をSortedObjectHeap
については
順番は関係なく、私は
SplHeap
、SplMaxHeap
またはSplMinHeap
を延長するかどうかを、正確に同じでないように見えます。私は、MinとMaxを切り替えるときに順序が逆転すると思っていましたが、それは起こっていないようです...だから、本当にこれら3つのクラスを拡張する違いは何ですか?ドキュメントから、
SplHeap
とSplPriorityQueue
との明らかな違いは、キューがinsert
方法で余分な$priority
パラメータを取るということです。だから、キューの中では、各インサートで何を並べ替えるべきか、ヒープを使って内部的に「知っている」と言う必要があるようです。違いがあるのでしょうか、それとも他の重要な違いがありますか?私は彼らが多分内部的に動作すると思いますか?どのようにしてこれら2つを選択するのですか?
自然な順序付けができたら 'SplMinHeap' /' SplMaxHeap'を使いますが、 'compare'メソッドをオーバーライドすれば' SplHeap'も拡張できますか?そして、ええ、 "ソートされた文字列のリスト"は、私が仮定している単純化のビットです...それは実際に私が半無作為に並べ替えて、特定の順序で処理する必要があるオブジェクトです。私は最初に収集してから並べ替えることができましたが、好奇心を基本にした2つのステップでそれをする必要がない方法を探していました。 – Svish
@Svish:はい。 'compare'をオーバーライドする場合は、' SplHeap'を使うべきです。 –