Vấn đề về Dictionary.

Liên hệ QC

Thanhlam2425

Thành viên hoạt động
Tham gia
23/11/18
Bài viết
113
Được thích
12
Mọi người cho mình hỏi.Trong dictionary có tìm kiếm tương đối không ạ.
Ví dụ như hàm INSTR,hoặc hàm Like. Đấy ạ.
 
Hình như là không, nhưng cũng có thể dùng InStr hoăc Like để trích số liệu
Uh nhưng vấn đề ở đây là.Dữ liệu gốc rất lớn.Nếu duyệt theo từng phần tử thì sẽ chậm.Nên không ổn lắm.
Mà bạn biết code nào so sánh giữa 2 dòng dữ liệu xem giống nhau bao nhiêu phần trăm không.
 
Upvote 0
Mọi người cho mình hỏi.Trong dictionary có tìm kiếm tương đối không ạ.
Ví dụ như hàm INSTR,hoặc hàm Like. Đấy ạ.
Dictionary dùng hask key để dò bảng. Chuyện hash tương đối chưa nghe nói tới.
Tuy nhiên, có vài cách để viết code dò.

Uh nhưng vấn đề ở đây là.Dữ liệu gốc rất lớn.Nếu duyệt theo từng phần tử thì sẽ chậm.Nên không ổn lắm.
...
Tìm lấy cái gì? Có 10 cái macth thì lấy cả 10?

...Mà bạn biết code nào so sánh giữa 2 dòng dữ liệu xem giống nhau bao nhiêu phần trăm không.
Đầu tiên hết phải biết tiêu chuẩn so sánh.
Con chó và con mèo giống nhau bao nhiêu phần trăm?
Con hy en (linh cẩu) trông giống chó hơn nhưng DNA thì gần với mèo hơn.
Nếu chỉ so sánh 2 mảng từ phần tử đầu tiên đến phần tử cuõi thì code rất dễ.
 
Upvote 0
Uh nhưng vấn đề ở đây là.Dữ liệu gốc rất lớn.Nếu duyệt theo từng phần tử thì sẽ chậm.Nên không ổn lắm.Mà bạn biết code nào so sánh giữa 2 dòng dữ liệu xem giống nhau bao nhiêu phần trăm không.
Có lẽ cách nạp dic chưa phù hợp. Bạn gửi file lên xem sao
 
Upvote 0
Có lẽ cách nạp dic chưa phù hợp. Bạn gửi file lên xem sao
Như vầy chả liên quan gì đến cách nạp cả:
key1: "totite", key2: "titeto", key3: "tetito", key4: "tototetiteto"
Tìm "*tite*"; kết quả: 1, 2, 4
Nó chỉ liên quan đến vấn đề: tìm làm cái gì?
 
Upvote 0
Như vầy chả liên quan gì đến cách nạp cả:
key1: "totite", key2: "titeto", key3: "tetito", key4: "tototetiteto"
Tìm "*tite*"; kết quả: 1, 2, 4
Nó chỉ liên quan đến vấn đề: tìm làm cái gì?
Thì là cách tạo key khi nạp dic đó bác.
Ví dụ như thớt muốn tra dic với 4 ký tự thì có thể tạo key dài 4 ký tự khi nạp dic
 
Upvote 0
Như vầy chả liên quan gì đến cách nạp cả:
key1: "totite", key2: "titeto", key3: "tetito", key4: "tototetiteto"
Tìm "*tite*"; kết quả: 1, 2, 4
Nó chỉ liên quan đến vấn đề: tìm làm cái gì?
Thì là kiểu kiểm tra tương đối đó bác.Ví dụ của bác ở trên kiểm tra xem "*tite*" đã có trong dic chưa.
Bác gợi ý cho cháu xem phương án nào tốt không ạ.
 
Upvote 0
Anh nói ngắn gọn mà ẩn ý cao siêu quá làm người ngu dốt như tôi đọc cũng không hiểu(dư thừa gì ạ)? Nếu không chê kẻ tầm thường thì anh có thể diễn đạt dễ hiểu hơn không ạ?
Trên trang Web, nạp dữ liệu vào Dic rồi Join dic.keys để tạo 1 chuổi sao đó dùng hàm instr để xét
Chỉ cần nối các dữ liệu trực tiếp, nếu được thì join mảng để tạo chuổi
 
Upvote 0
Trên trang Web, nạp dữ liệu vào Dic rồi Join dic.keys để tạo 1 chuổi sao đó dùng hàm instr để xét
Chỉ cần nối các dữ liệu trực tiếp, nếu được thì join mảng để tạo chuổi
Nếu vậy thì lại dùng hàm instr rồi.Mà nếu dữ liệu lớn tầm 100k phần tử nối lại với nhau chưa chắc đã chạy được.:D.
Anh Hiếu có phương án nào giải quyết những bài như thế này không ạ.
 
Upvote 0
Nếu vậy thì lại dùng hàm instr rồi.Mà nếu dữ liệu lớn tầm 100k phần tử nối lại với nhau chưa chắc đã chạy được.:D.
Anh Hiếu có phương án nào giải quyết những bài như thế này không ạ.
Bây giờ vẫn là 00000000000000000 phần tử thì hỏi phương án để làm gì?

***
Tới thớt: Nêu bài toán chứ đừng CHỈ nêu cái phương án trong đầu của mình.
 
Upvote 0
Bây giờ vẫn là 00000000000000000 phần tử thì hỏi phương án để làm gì?

***
Tới thớt: Nêu bài toán chứ đừng CHỈ nêu cái phương án trong đầu của mình.
Tôi đã hỏi "dùng để làm gì" mà chủ thớt cứ mập mập mờ mờ.
Vì mức độ chạy của code liên quan trực tiếp đến áp dụng cho nên bắt buộc phải biết đủ chi tiết.

Tôi trả lời ở đây cho bạn nào muốn đào sâu vào vấn đề này:
1. Hàm Filter của VBA có khả năng lọc một array theo giá trị bán phần (part match). Tuy Dictionary.Keys là collection, nhưng hàm này vẫn nhận.
Vì vậy, ta có thể dùng hàm này và bẫy lỗi trả về 0 phần tử (tức là chưa có trị bán phần này)
2. Nếu cứ mỗi trị mới lại phải gọi filter thì cũng hơi tốn năng lượng. Vì vậy, phải lập thêm một dictionary phụ để chứa trị bán phần, và xét nó trước.

Tuy nhiên, phương pháp dò bán phần chỉ dò được tập hợp mẹ chứ không thể dò tập hợp con.
Ví dụ dò mẹ:
Dic đã có key "abcde"
Bạn có thể dò được, "abc", "bcd", ... (một phần của key có sẵn)
Ví dụ dò con:
Dic đã có key "abcde"
Thuật toán để dò "xabcdeyz" (chứa "abcde", "xabc", ...) hết sức phức tạp.
 
Upvote 0

File đính kèm

Upvote 0
Nếu đúng thế, và tìm 1 lần thì cứ FOR, với like, và dùng wildcard là nhanh Hoặc Filter thì nhanh hơn nữa
vì dùng DIC cũng phải nạp vào 1 lần,
Nếu dùng FOR bình thường 2 vòng lặp lồng nhau thì với dữ liệu của em đưa ra nó là :30.000 * 15.000 vòng lặp cũng lâu lắm anh à. Còn 2 cái này dùng wildcard là nhanh Hoặc Filter thì nhanh hơn nữa em chưa biết dùng anh hướng dẫn em.Hoặc viết code mẫu hộ em ạ. Em cảm ơn.
 
Upvote 0
Nếu dùng FOR bình thường 2 vòng lặp lồng nhau thì với dữ liệu của em đưa ra nó là :30.000 * 15.000 vòng lặp cũng lâu lắm anh à. Còn 2 cái này dùng wildcard là nhanh Hoặc Filter thì nhanh hơn nữa em chưa biết dùng anh hướng dẫn em.Hoặc viết code mẫu hộ em ạ. Em cảm ơn.
vẫn chưa hiểu yêu cầu là tìm gì, sao tìm?
Bạn muốn cụ thể, và cột nào 30.000 cột nào 15.000?
 
Upvote 0
@Thanhlam2425
Mã:
Sub Instr_Like()
Dim Arr0, Arr1, i
On Error Resume Next
Arr0 = Sheet1.Range("a1").CurrentRegion
Arr1 = Sheet1.Range("d1").CurrentRegion
With CreateObject("Scripting.dictionary")
    For i = 2 To UBound(Arr1)
        .Item(Arr1(i, 1)) = ""
    Next i
    For i = 2 To UBound(Arr0)
        .Remove Arr0(i, 1)
    Next i
    Sheet1.Range("g1") = .Count
    Sheet1.Range("g2").Resize(.Count, 1) = Application.Transpose(.keys)
End With
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom