Lọc là một cách để thực hiện việc này, như được thảo luận trong các câu trả lời khác.
Lọc không thể mở rộng được. Trên bề mặt thời gian phức tạp sẽ xuất hiện là O (n) (nghĩa là đã không thể mở rộng nếu số đối tượng trong bộ sưu tập sẽ phát triển), nhưng thực tế vì một hoặc nhiều hơn kiểm tra cần phải được áp dụng cho từng đối tượng tùy thuộc vào truy vấn, độ phức tạp thời gian chính xác hơn là O (nt) trong đó t là số lần kiểm tra áp dụng cho từng đối tượng.
Vì vậy, hiệu suất sẽ giảm dần khi các đối tượng bổ sung được thêm vào bộ sưu tập, và/hoặc khi số lượng kiểm tra trong truy vấn tăng lên.
Có một cách khác để thực hiện việc này, sử dụng lập chỉ mục và đặt lý thuyết.
Một cách tiếp cận là để build chỉ số trên lĩnh vực trong các đối tượng được lưu trữ trong bộ sưu tập và mà bạn sau đó sẽ kiểm tra trong truy vấn của bạn.
Giả sử bạn có một bộ sưu tập gồm Car
đối tượng và mọi đối tượng Car
đều có một trường color
. Giả sử truy vấn của bạn tương đương với "SELECT * FROM cars WHERE Car.color = 'blue'
". Bạn có thể xây dựng một chỉ mục trên Car.color
, mà về cơ bản sẽ trông như thế này:
'blue' -> {Car{name=blue_car_1, color='blue'}, Car{name=blue_car_2, color='blue'}}
'red' -> {Car{name=red_car_1, color='red'}, Car{name=red_car_2, color='red'}}
Sau đó được đưa ra một truy vấn WHERE Car.color = 'blue'
, tập xe ô tô màu xanh có thể được lấy ra trong thời gian O() thời gian phức tạp. Nếu có các thử nghiệm bổ sung trong truy vấn của bạn, bạn có thể kiểm tra từng chiếc xe trong số ứng cử viên được đặt để kiểm tra xem nó có khớp với các thử nghiệm còn lại trong truy vấn của bạn không. Vì tập hợp ứng viên có thể nhỏ hơn đáng kể so với toàn bộ bộ sưu tập, độ phức tạp thời gian là nhỏ hơn O (n) (theo nghĩa kỹ thuật, xem các nhận xét bên dưới). Hiệu suất không làm giảm càng nhiều, khi các đối tượng bổ sung được thêm vào bộ sưu tập. Nhưng điều này vẫn chưa hoàn hảo, hãy đọc tiếp.
Cách tiếp cận khác, là những gì tôi sẽ gọi là chỉ mục truy vấn đứng. Để giải thích: với phép lặp và lọc thông thường, bộ sưu tập được lặp lại và mọi đối tượng được kiểm tra xem nó có phù hợp với truy vấn hay không. Vì vậy, lọc giống như chạy một truy vấn trên một bộ sưu tập. Một chỉ mục truy vấn đứng sẽ là một cách khác xung quanh, nơi mà bộ sưu tập thay vì chạy trên truy vấn, nhưng chỉ một lần cho mỗi đối tượng trong bộ sưu tập, mặc dù bộ sưu tập có thể được truy vấn bất kỳ số lần nào.
Một đứng chỉ số truy vấn sẽ như thế nào đăng ký một truy vấn với một số loại bộ sưu tập thông minh, như vậy là đối tượng được thêm vào và lấy ra từ bộ sưu tập, bộ sưu tập sẽ tự động kiểm tra từng đối tượng chống lại tất cả các đứng truy vấn đã được đăng ký với nó. Nếu một đối tượng khớp với một truy vấn đứng thì bộ sưu tập có thể thêm/xóa nó vào/từ một bộ chuyên dụng để lưu trữ các đối tượng khớp với truy vấn đó. Sau đó, các đối tượng khớp với bất kỳ truy vấn đã đăng ký nào có thể được truy xuất trong độ phức tạp thời gian O().
Thông tin bên trên được lấy từ CQEngine (Collection Query Engine). Về cơ bản, đây là một công cụ truy vấn NoSQL để truy xuất các đối tượng từ các bộ sưu tập Java bằng cách sử dụng các truy vấn giống SQL, mà không cần phải lặp lại thông qua bộ sưu tập. Nó được xây dựng xung quanh các ý tưởng trên, cộng thêm một số ý tưởng khác. Disclaimer: Tôi là tác giả. Đó là mã nguồn mở và trong maven trung tâm. Nếu bạn thấy hữu ích, vui lòng upvote câu trả lời này!
là phiên dịch xpath? –
nó là một thông dịch biểu thức XPath –