同一カテゴリ内の前後リンク 

iBlog + JavaScript な話。
前後のエントリへのリンクがつけられるようになったのはありがたいけど、「同じカテゴリ内での前後のエントリ」へのリンクも欲しい。 

ぐぐっても解決策が見つからなかったので、しぶしぶ自分で実装しました。
でも、じつはその時には、すでに .Mac Tips の OKAMURA さんが解決法を提示してくださっていたという事実! 衝撃でした…。

ただ、ほぼ同様のアルゴリズム(っていうか、iBlog だとこうなる)の自分のコードを検討するうち、非効率性が気になったりもして。
同じカテゴリ内の前のエントリを探す例でいうと、
var theCategoryUUID = getCategoryUUIDForEntry(entryUUID);
for (var i = 0; i < entryUUIDsList.length - 1; i++) {
    if (entryUUIDsList[i] == entryUUID) {
        for (i++; i < entryUUIDsList.length; i++) {
            var theEntryUUID = entryUUIDsList[i];
            if (theCategoryUUID == getCategoryUUIDForEntry(theEntryUUID)) {
                ※ theEntryUUID が「前のエントリ」
                return;
            }
        }
    }
}

気になるのは、ループの中で getCategoryUUIDForEntry() を呼び出すこと。
getCategoryUUIDForEntry() 自体がループを回す(しかもデフォルトだと必要回の2倍)ので、最悪の場合、全エントリ数をnとすると (S(n)-1)×2-1 回のループが回ってしまうのでは?
エントリ100個で1万回以上。

やる内容は同じでも、entryCategoryUUIDPairs をグローバル変数にして、
for (var i = 0; i < entryCategoryUUIDPairs.length - 1; i += 2) {
    if (entryCategoryUUIDPairs[i] == entryUUID) {
        var theCategoryUUID = entryCategoryUUIDPairs[i+1];
        for (i+=2; i < entryCategoryUUIDPairs.length - 1; i+=2) {
            var theEntryUUID = entryCategoryUUIDPairs[i];
            if (theCategoryUUID == entryCategoryUUIDPairs[i+1]) {
                ※ theEntryUUID が「前のエントリ」を指す
                return;
            }
        }
    }
}

とかすればループは1回。
とにかく getCategoryUUIDForEntry() が問題。付け焼き刃なのは仕方ないとしても、実装が美しくなさすぎ
せめて連想配列にしてくれれば、「ループが…」とか気にならないのに。

と、ぶーたれながらもいじくれる iBlog を捨てられないわけですが。 

木 - 8 月 19, 2004 at 03:34 []