SortedList-Sắp xếp theo key bằng collection

Euler

Administrator
Thành viên BQT
Tạo SortedList:
Giả sử ta có data mà các key chỉ xuất hiện một lần duy nhất (hãy chú ý tính duy nhất).
Bạn cần đăng nhập để thấy đính kèm


Các key tôi viết trên cột B, chúng có tính duy nhất, không có key nào trùng nhau.
Bây giờ tôi sẽ sắp xếp dữ liệu theo Key, không để nó lộn xộn như trên nữa.
Mã:
Sub test_A1()
    Dim DataList As Object
    Dim x, i As Long
        Set DataList = CreateObject("System.Collections.SortedList")

        x = Range("B2:C8").Value
        For i = LBound(x) To UBound(x)
            If DataList.Contains(x(i, 1)) = False Then
                DataList.Add x(i, 1), x(i, 2)
            End If
        Next i
        For i = 0 To DataList.Count - 1
            Cells(i + 2, 5).Value = DataList.GetKey(i)
            Cells(i + 2, 6).Value = DataList.GetByIndex(i)
        Next i

        Set DataList = Nothing

End Sub
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


Nào, bây giờ nếu key bị trùng lặp thì làm thế nào đây?
Đầu tiên, hãy xem lại code trên, nếu Key chưa tồn tại thì đoạn code dưới đây sẽ nạp vào collection.
Mã:
If DataList.Contains(x(i, 1)) = False Then 
  DataList.Add x(i, 1), x(i, 2)
End If
Nếu đã tồn tại rồi thì không nạp nữa.
Do đó ta có kết quả như sau:
Bạn cần đăng nhập để thấy đính kèm

Bây giờ ta sửa cách nạp vào collection thành như sau:
Mã:
Sub test_A2()
    Dim DataList As Object
    Dim x, i As Long
        Set DataList = CreateObject("System.Collections.SortedList")

        x = Range("B2:C8").Value
'        For i = LBound(x) To UBound(x)
'            If DataList.Contains(x(i, 1)) = False Then
'                DataList.Add x(i, 1), x(i, 2)
'            End If
'        Next i
        For i = LBound(x) To UBound(x)
            DataList.Item(x(i, 1)) = x(i, 2)
        Next i
        For i = 0 To DataList.Count - 1
            Cells(i + 2, 5).Value = DataList.GetKey(i)
            Cells(i + 2, 6).Value = DataList.GetByIndex(i)
        Next i

        Set DataList = Nothing

End Sub
Hãy chú ý đoạn code dòng 12~14, bây giờ thì nó sẽ cập nhật key ở lần phát hiện mới nhất, vì vậy kết quả sẽ thành:
Bạn cần đăng nhập để thấy đính kèm


Nguồn tham khảo và dịch:
 

giaiphapvba

Administrator
Thành viên BQT
Ứng dụng vào sắp xếp ngẫu nhiên:
Ta có thể sử dụng SortedList để sắp xếp ngẫu nhiên.
Đầu tiên tôi trình bày về cách nghĩ trước.
Giả sử chúng ta cần sắp xếp ngẫu nhiên các số từ 1 đến 10. Các số từ 1 đến 10 ta coi là Item. Ứng với các Item ta xây dựng Key bằng hàm ngẫu nhiên Rnd.
Bạn cần đăng nhập để thấy đính kèm


Thông qua SortedList thì các Key (mà ta xây dựng ngẫu nhiên) sẽ được sắp xếp theo trật tự tăng dần. Vì vậy các Item (Các số từ 1 đến 10) tương ứng cũng sẽ bị đảo vị trí theo trật tự ấy.
Kết quả:
Bạn cần đăng nhập để thấy đính kèm


Mã:
Sub test_B1()
    Dim i As Long
    Dim DataList As Object
    Dim x
        Set DataList = CreateObject("System.Collections.SortedList")
        Randomize

        For i = 1 To 10
            DataList.Item(Rnd()) = i 'Key la Rnd(), Item la i
        Next i
        'tuhocvba.net comment
        'Cac key duoc xay dung ngau nhien, vi tri lon-be la ngau nhien, bay gio thong qua sortedlist
        'cac key se duoc sap xep lai theo thu tu tang dan
        'vi the ma vi tri cua cac item cung bi dao lai
        'ket qua la ta co vi tri item la ngau nhien
        For i = 0 To DataList.Count - 1
            Cells(i + 1, 1).Value = DataList.GetByIndex(i)
            Cells(i + 1, 2).Value = DataList.GetKey(i)
        Next i

        Set DataList = Nothing

End Sub
 

vbano1

SMod
Thành viên BQT
Bây giờ ta có dữ liệu mà chúng bị trùng lặp nhau rất nhiều, và chúng ta muốn lọc ra duy nhất.
Chúng ta có thể sử dụng Filter hoặc Dictionary, tuy nhiên tôi muốn giới thiệu với các bạn rằng SortedList cũng có thể làm được điều ấy.
Mã:
Sub test_B2()
  Dim i As Long
  Dim DataList As Object
  Dim x
    Set DataList = CreateObject("System.Collections.SortedList")

    x = Range("A1:A10").Value
    For i = LBound(x) To UBound(x)
      DataList.Item(x(i, 1)) = ""     'Day chinh la add key= x(i,1) va item = "" vao Collection SortedList (tuhocvba.net comment)
    Next i

    For i = 0 To DataList.Count - 1
      Cells(i + 1, 3).Value = DataList.GetKey(i)
    Next i

    Set DataList = Nothing

End Sub
Bạn cần đăng nhập để thấy đính kèm
 

tuhocvba

Administrator
Thành viên BQT
Các Phương Thức hay dùng với SortedList
Như vậy, chúng ta đã thấy được sức mạnh của SortedList Collection, nó có thể kiểm tra Key tồn tại hay không, lọc duy nhất, truy xuất Key và Item-những điều này làm cho nó chẳng khác nào là Dictionary, hơn thế nữa nó còn có khả năng sắp xếp key theo thứ tự tăng dần.
Tôi giới thiệu qua một số phương thức chính hay được dùng:

Add Key: Thêm key cho SortedList Collection
Mã:
Sub test_C1()
    Dim i As Long
    Dim DataList As Object
    Dim x
        Set DataList = CreateObject("System.Collections.SortedList")

        x = Range("A1:B5").Value
        For i = LBound(x) To UBound(x)
            If DataList.Contains(x(i, 1)) = False Then
                DataList.Add x(i, 1), x(i, 2)
            End If
        Next i

        'Them key
        DataList.Add "Cam", 6 'Key = Cam, Item = 6

        'Xuat ra noi dung
        Range("D:E").ClearContents
        For i = 0 To DataList.Count - 1
            Cells(i + 1, 4).Value = DataList.GetKey(i)
            Cells(i + 1, 5).Value = DataList.GetByIndex(i)
        Next i

        Set DataList = Nothing

End Sub
Bạn cần đăng nhập để thấy đính kèm



Clear: Ta có thể xóa sạch các thành phần trong SortedList làm cho nó không còn dữ liệu gì cả.
Mã:
Sub test_C2()
    Dim i As Long
    Dim DataList As Object
    Dim x
        Set DataList = CreateObject("System.Collections.SortedList")

        x = Range("A1:B5").Value
        For i = LBound(x) To UBound(x)
            If DataList.Contains(x(i, 1)) = False Then 'Kiem tra key tồn tại hay chưa, nếu chưa thì mới add để không bị lỗi (tuhocvba.net comment)
                DataList.Add x(i, 1), x(i, 2)
            End If
        Next i

         'Xoa sach du lieu
        DataList.Clear

        'Them key
        DataList.Add "Cam", 6

        'Xuat ra noi dung
        Range("D:E").ClearContents
        For i = 0 To DataList.Count - 1
            Cells(i + 1, 4).Value = DataList.GetKey(i)
            Cells(i + 1, 5).Value = DataList.GetByIndex(i)
        Next i

        Set DataList = Nothing

End Sub
Bạn cần đăng nhập để thấy đính kèm


Remove: Xóa bỏ Key nào đó do chúng ta chỉ định
Mã:
Sub test_C3()
    Dim i As Long
    Dim DataList As Object
    Dim x
        Set DataList = CreateObject("System.Collections.SortedList")

        x = Range("A1:B5").Value
        For i = LBound(x) To UBound(x)
            If DataList.Contains(x(i, 1)) = False Then
                DataList.Add x(i, 1), x(i, 2)
            End If
        Next i

      'Xoa bo key = "Cam"
        DataList.Remove ("Cam")

        'Xuat ra noi dung
        Range("D:E").ClearContents
        For i = 0 To DataList.Count - 1
            Cells(i + 1, 4).Value = DataList.GetKey(i)
            Cells(i + 1, 5).Value = DataList.GetByIndex(i)
        Next i

        Set DataList = Nothing

End Sub
Bạn cần đăng nhập để thấy đính kèm
 
Top