>source

Fruit라는 클래스를 만들고 이를 사용하여 과일의 정렬된 목록을 생성하고 SortedList에 저장하려고 합니다. 그러나 지금 내가 직면하고 있는 문제는 먼저 길이를 기준으로 정렬하고 길이가 같으면 알파벳순으로 정렬해야 한다는 것입니다.

지금까지 내 code는 다음과 같습니다.

class Node:
    # Constructor
    def __init__(self):
        self.nextNode= None
class Fruit(Node):
    def __init__(self, name):
        self.name= name
        self.nextNode= None
    def __str__(self):
        return f"'{self.name}'"
    def __eq__(self,otherNode):
        if otherNode== None:
            return False
        else:
            return self.name== otherNode.name
    def __lt__(self, otherNode):
        if otherNode== None:
            raise TypeError("'<' not supported between instances of 'Temp' and 'NoneType'")
        while len(self.name) < len(otherNode.name):
#            if len(self.name)== len(otherNode.name):
#                 while
#                     return self.name and otherNode.name
#            else:
                return self.name and otherNode.name
class SortedList:
    def __init__(self):
        self.headNode= None
        self.currentNode= None
        self.length= 0
    def __appendToHead(self, newNode):
        oldHeadNode= self.headNode
        self.headNode= newNode
        self.headNode.nextNode= oldHeadNode
        self.length += 1
    def insert(self, newNode):
        self.length += 1
        # If list is currently empty
        if self.headNode== None:
            self.headNode= newNode
            return
        # Check if it is going to be new head
        if newNode < self.headNode:
            self.__appendToHead(newNode)
            return
        # Check it is going to be inserted
between any pair of Nodes (left,right)
        leftNode= self.headNode
        rightNode= self.headNode.nextNode
        while rightNode != None:
            if newNode < rightNode:
                leftNode.nextNode= newNode
                newNode.nextNode= rightNode
                return
            leftNode= rightNode
            rightNode= rightNode.nextNode
        # Once we reach here it must be added at the tail
        leftNode.nextNode= newNode
    def __str__(self):
        # We start at the head
        output=""
        node= self.headNode
        firstNode= True
        while node != None:
            if firstNode:
                output= node.__str__()
                firstNode= False
            else:
                output += (',' + node.__str__())
            node= node.nextNode
        return output
# Main program for fruit
l= SortedList()
# Populate a sorted list with fruitnames
fruits= ['Cherry', 'Apricot','lime','blueberry','Apple','Date']
print('Before sorting')
print(fruits)
for fruit in fruits:
    l.insert(Fruit(fruit))
print('\nAfter sorting')
print(l)

오류가 있는 부분은 Fruit클래스에 있습니다.
내 출력은 다음과 같습니다.

Before sorting
['Cherry', 'Apricot', 'lime', 'blueberry', 'Apple', 'Date']
After sorting
'lime','Date','Apple','Cherry','Apricot','blueberry'

예상 출력은 다음과 같습니다.

Before sorting
['Cherry', 'Apricot', 'lime', 'blueberry', 'Apple', 'Date']
After sorting
'Date','lime','Apple','Cherry','Apricot','blueberry'

고칠 방법?

return self.name 및 otherNode.name은 무엇을 의미합니까?

ForceBru2021-11-18 06:24:11

self.name은 목록에 있는 과일의 현재 이름이고 otherNode.name은 목록에 있는 과일의 다음 이름입니다.

Triston Loh2021-11-18 06:24:11

Fruit.__lt__ 함수는 정렬이 올바르게 작동하려면 항상 부울을 반환해야 하지만 otherNode.name >self.name이면 아무 것도 반환하지 않는 것처럼 보입니다.

Serial Lazer2021-11-18 06:24:11

@TristonLoh, 하지만 왜 and 연산자인가요? 모든 피연산자가 "truthy"인 경우 첫 번째 "falsy" 피연산자 또는 마지막 "truthy" 피연산자를 반환합니다. (0 and 7)== 0, ('hello' and 'world')== 'world'.

ForceBru2021-11-18 06:24:11

@ForceBru, 예, 내가 해서는 안 되는 출력을 강제하는 데 동의합니다. 그래서 잘만되면 누군가가 더 나은 솔루션을 가지고 있기를 바랍니다. 어떻게 작동하는지 잘 모르겠습니다.

Triston Loh2021-11-18 06:24:11
  • 이전 java : postDelayed에서 Intent를 사용하는 방법 -Android
  • 다음 reference : 자체 참조 루프 EntityFramework 문제, 해결 방법은?