TL에 의한 클래스의 그룹, DR :정렬 기본 속성
알고리즘을 선별 라이브러리에 클래스 모음/목록을 통과하고, 바람직하게 (이 정렬 된 목록을 반환 얻을 방법이 있나요 명명 된/기본 클래스 속성)?
저는 최근에 일부 파이썬을 배우 았으며 어떤 반복 가능한 것을 정렬 할 수있는 Sorted()
함수에 깊은 인상을 받았습니다. 숫자의 경우 이것은 간단하지만 클래스의 경우 비교 방법 like this을 할당 할 수 있습니다. 이 메서드는 비교 연산자에게 클래스의 두 인스턴스를 비교하는 방법을 알려줍니다. 그 중에서도 내장 된 정렬 알고리즘을 사용하여 클래스 모음을 정렬 할 수 있습니다.
VBA에서 나는 이것을 반증하는 데 반 성공했습니다. 클래스 'default memberAttribute
을 설정하면 클래스에 직접 비교 연산자 (<
, =
, >=
등)를 사용할 수 있습니다. 이 클래스의
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "defaultProp"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Private randVal As Single
Public Property Get DefaultValue() As Single
Attribute Value.VB_UserMemId = 0
DefaultValue = randVal
End Property
Private Property Let DefaultValue(ByVal value As Single)
randVal = value
End Property
Private Sub Class_Initialize()
DefaultValue = Rnd()
End Sub
두 인스턴스를 비교 할 수 있습니다 : 예 클래스 받아
Dim instance1 As New defaultProp
Dim instance2 As New defaultProp
Debug.Print instance1.DefaultValue > instance2.DefaultValue
Debug.Print instance1 > instance2 'exactly equivalent, as the DefaultValue has the correct Attribute
을 내가 값을 정렬 할 수있는 VBA 정렬 알고리즘을 구현 한 경우에 의해 클래스를 정렬 아무 문제가 없을 것 기본값*. 그러나 내장 알고리즘/라이브러리 정렬 알고리즘을 사용하는 편이 좋습니다 (명확성, 효율성, 적절한 오류 처리 등)
* these algorithms 중 하나는 작동하도록 변경해야하지만 전환해야합니다. 클래스의 전체가 아닌 값 (Set
을 더함)
VBA 비교 연산자에는 아무런 문제가 없으므로 라이브러리를 사용하는 모든 것이 동일하다고 가정했습니다. 내가 ArrayList으로 시도 때 :
Sub testArrayList()
Dim arr As Object
Set arr = CreateObject("System.Collections.ArrayList")
' Initialise the ArrayList, for instance by generating random values
Dim i As Long
Dim v As defaultProp
For i = 1 To 5
Set v = New defaultProp
arr.Add v 'no problem here
Next i
arr.Sort 'raises an error
End Sub
나는 배열의 두 요소를 비교하는 데 실패 오류
얻을
그래서 무슨 일이야? 내 접근 방식의 결함입니까? 기본 속성이 ArrayList
으로 변경되지 않았습니까? 또는 라이브러리가 작성된 언어의 비교 연산자는 VBA와 Python이 사용하는 것보다 floopy-gloopy가 아닌가? 시도하는 내장 된 정렬 알고리즘에 대한 제안도 유용 할 것입니다! 당신이 arr
에의 DefaultValue를 추가하는 경우
아, 그렇지만 클래스가 아닌 값 배열을 가지고 있습니다. 어떤 값으로 클래스 목록을 정렬하고 싶지만 실제적으로 전체 클래스 객체를 – Greedo
@Greedo 주위로 이동하십시오. 편집을 참조하십시오. – Vityata
그래서 비교 연산자는 클래스가 ArrayList (두 번째 코드 비트)에 추가 될 때 작동하지만 직접 정렬하지 않아도됩니까? 해결 방법에 대한 아이디어는 개체의 기본 값이 아니기 때문에 기본값으로 설정해야합니다 (물론 후자를 이전 개체로 매핑 할 수 있지만 라이브러리 정렬을 사용하지 않는 것이 좋습니다) – Greedo