3

割り当てからの質問は、順序付けられた二重リンクリストを作成することを示しています...辞書式に小さい名前の各オブジェクトが他のオブジェクトの「前」に来るように...辞書の名前のように...同じ名前のオブジェクトも配置できます任意の順序で...

私が持っている2つのオブジェクトsetBefore()setAfter()メソッドをリンクするために...そして私はこれをたくさんしました...しかしそれでも私がどこで間違っているのかわかりません..あなたたちからの少しのガイダンスが私を助けることができるかもしれません...

atMeは、二重リンクリストにすでに存在し、newFrob挿入されるオブジェクトです。

def insert(atMe, newFrob):
    if newFrob.myName() < atMe.myName():
        if atMe.getBefore() == None:
            atMe.setBefore(newFrob)
            newFrob.setAfter(atMe)
        elif atMe.getBefore().myName()<newFrob.myName():
            atMe.getBefore().setAfter(newFrob)
            newFrob.setBefore(atMe.getBefore)
            atMe.setBefore(newFrob)
            newFrob.setAfter(atMe)
        else:
            insert(atMe.getBefore(),newFrob)

    elif newFrob.myName() > atMe.myName():
        if atMe.getAfter() == None:
            atMe.setAfter(newFrob)
            newFrob.setBefore(atMe)
        elif atMe.getAfter().myName()>newFrob.myName():
            atMe.getAfter().setBefore(newFrob)
            newFrob.setAfter(atMe.getAfter)
            atMe.setAfter(newFrob)
            newFrob.setBefore(atMe)
        else:
            insert(atMe.getAfter(),newFrob)

    elif newFrob.myName()==atMe.myName():
        if atMe.getAfter() != None:
            newFrob.setAfter(atMe.getAfter())
        newFrob.setBefore(atMe)
        if atMe.getAfter() != None:
            atMe.getAfter().setBefore(newFrob)
        atMe.setAfter(newFrob)

そして、これは使用されるFrobクラスです...

class Frob(object):
    def __init__(self, name):
        self.name = name
        self.before = None
        self.after = None
    def setBefore(self, before):
        self.before = before
    def setAfter(self, after):
        self.after = after
    def getBefore(self):
        return self.before
    def getAfter(self):
        return self.after
    def myName(self):
        return self.name

ここで、BeforeとAfterは、二重リンクリスト内の左右のオブジェクトへのリンクです...このクラスのオブジェクトは、二重リンクリストに挿入されます...

例:

a=Frob('foo')
b=Frob('bar')
c=Frob('frob')
d=Frob('code')

code                             output
insert(a,b)                   bar->foo
insert(a,c)                   bar->foo->frob
insert(b,d)                   bar->code->foo->frob

今仮定します

code                             output
insert(b,Frob('code'))        bar->code->code->foo->frob
4

1 に答える 1

3

問題はこの行にあります(そしてあなたが他の方向に動いているときの同等の問題):

newFrob.setBefore(atMe.getBefore)

の後に括弧のセットがないため、そのメソッドによって返される値ではなくatMe.getBefore、バインドされたメソッド自体を渡すことになります。newFrob.setBeforeこれは簡単にタイプミスできるので、あなたの課題でそれを見逃してもそれほど悪くはありません。

次の一連の挿入を試し、値を調べてエラーを見つけました(コメントを使用して正常に機能したものを要約しました)。

>>> a = Frob("a")
>>> b = Frob("b")
>>> c = Frob("c")
>>> d = Frob("d")
>>> insert(a, b) # list is a<->b
>>> insert(a, d) # list is a<->b<->d
>>> insert(a, c) # list is a<->b<->c->?
>>> c.getAfter()
<bound method Frob.getAfter of <__main__.Frob object at 0x000000000318EBA8>>

最後に記載されているオブジェクトはbです。これにより、コード内のエラーを見つけることができます。

于 2013-01-14T15:43:13.043 に答える