气泡在链接列表中排序。如何按歌手姓名排序?

时间:2019-01-14 11:44:39

标签: python bubble-sort

我想按艺术家名称对结果进行排序,但是它不起作用。我收到AttributeError: 'str' object has no attribute 'artistName'错误。

这是我的链表。我添加带有音乐ID,音乐名称和艺术家名称的音乐,然后链接列表将它们打印出来。我想按艺术家姓名的字母顺序对链接列表进行排序,但我的代码似乎无法正常工作。

有人可以帮我解决冒泡排序sortByArtistError()的问题,因为我现在认为我的代码是数字的,但是如何按字母特别是艺术家的名字排列呢?

2 个答案:

答案 0 :(得分:0)

我没有足够的声誉来发表简单的评论,但请查看this answer。 您应该为链接列表实现一种排序算法,在上面的链接答案中,您可以看到“合并排序”实现。当然,请使用艺术家的名字来比较元素。

编辑:和here is an insertion sort

答案 1 :(得分:0)

您的代码令人困惑,因为您尝试在不同的上下文中使用名称next。通常,不建议将关键字用作对象名称。同样,您应该仔细研究如何使用相应的dunder方法来实现迭代器协议。在我看来,您在那里错过了一些东西。

话虽如此,我想出了一些更干净的代码。它当然不是最佳选择,但是出于可读性考虑,您可以将其用作进行进一步研究的起点。

对于节点类,我用属性对象替换了您的getter和setter方法。这样,您可以像属性一样访问变量,但是在后台会调用相应的getter和setter。这样可以节省很多打字。

class Node:
    def __init__(self, newData=None, nextNode=None):
        self.data = newData
        self.nxt  = nextNode

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, newData):
        self._data = newData

    @property
    def nxt(self):
        return self._nxt

    @nxt.setter
    def nxt(self, newNode):
        self._nxt = newNode

这仍然没有改变:

class Music :
    def __init__(self, id, musicName, artistName):
        self.id = id
        self.musicName = musicName
        self.artistName = artistName
    #defining how the string is displayed
    def __repr__(self):
        #adds in and formats the id, musicName, and artistName added to the Music collection
        return f'Music ID: {self.id}\nMusic Name: {self.musicName}\nArtist Name: {self.artistName}\n'

没有。为了能够遍历链接列表,您需要__iter____next__ dunder方法。此后可以用于iteritems函数,该函数又可以用于显示列表。

对于所请求的冒泡排序,功劳归于this github repo,我仅将其用于此上下文。我没有检查这是否是最快的实现,但是它可以工作。

class LinkedList:
    def __init__(self):
        self.head  = None
        self.size = 0

    def __iter__(self):
        self.pointer = self.head
        return self

    def __next__(self):
        if self.pointer is None:
            raise StopIteration
        curr, self.pointer = self.pointer, self.pointer.nxt
        return curr

    def get_size(self):
        return self.size

    def iteritems(self):
        for pos, node in enumerate(self):
            yield pos, node

    def addMusicToFront(self, newData):
        newNode = Node(newData, self.head)
        self.head = newNode
        self.size += 1

    def displayMusic(self):
        for _, node in self.iteritems():
            print(node.data)

    def sortByArtistName(self):
        sorted = False
        count = 0

        while not sorted:
            sorted = True
            prev = self.head
            curr = self.head.nxt

            while curr is not None:
                if prev.data.artistName > curr.data.artistName:
                    sorted = False
                    prev.data, curr.data = curr.data, prev.data
                    count += 1
                prev = curr
                curr = curr.nxt

MusicList = LinkedList()

MusicList.addMusicToFront(Music(1, "walkingdead", "beter"))
MusicList.addMusicToFront(Music(2, "pokemon", "albert"))
MusicList.addMusicToFront(Music(3, "power ranger", "dylan"))
MusicList.addMusicToFront(Music(4, "man", "carry"))

MusicList.sortByArtistName()
MusicList.displayMusic()

在我的机器上(使用Python 3.6),这将产生以下输出:

Music ID: 2
Music Name: pokemon
Artist Name: albert

Music ID: 1
Music Name: walkingdead
Artist Name: beter

Music ID: 4
Music Name: man
Artist Name: carry

Music ID: 3
Music Name: power ranger
Artist Name: dylan