Cách tốt nhất để lập mô hình ưu tiên/sở thích trong một tên miền là gì?
Ví dụ: giả sử tôi có một lớp học Person
đại diện cho một người và có một số tùy chọn, ví dụ: PersonX
thích pizza, spaggetti và omelete và thực sự anh ấy thích spagetti hơn pizza.
Các mô hình này được mô hình hóa tốt nhất như thế nào?
Ý tưởng đầu tiên là chỉ để đặt chúng trong một List
(dưới dạng biến thành viên của Person
) giữ tùy chọn theo thứ tự chèn, ví dụ: đầu tiên trong danh sách được ưa thích nhất, sau đó là thứ hai trong danh sách thứ hai được ưa chuộng nhất, nhưng điều này dường như với tôi để kết thúc quá tẻ nhạt. Ví dụ. khi tôi muốn thực hiện tìm kiếm hoặc liên kết cho các tuỳ chọn, v.v.
Có lẽ có cách tiếp cận chuẩn cho các vấn đề như thế này?Cách tốt nhất để thể hiện các ưu tiên/sở thích trong các đối tượng là gì?
Trả lời
Bạn có thể sử dụng danh sách khi bạn đề nghị và thêm một phương pháp để lớp người bạn đó sẽ trả về một Comparator<Preference>
mà sẽ có thể so sánh 2 ưu đãi đối với người đó:
Person somebody.addPreference(pizzaPreference);
Person somebody.addPreference(omelettePreference);
....
Comparator<Preference> c = somebody.getPreferenceComparator();
boolean prefersPizzaOverOmelette = (c.compare(pizzaPreference, omelettePreference) > 0);
boolean hasNoPreferenceBetweenPizzaAndOmelette = (c.compare(pizzaPreference, omelettePreference) == 0);
Và so sánh đơn giản sẽ kiểm tra chỉ mục của tùy chọn trong danh sách của bạn (nếu nó chứa tùy chọn đó, v.v.).
Bạn có thể sử dụng priority queue để biểu thị các ưu tiên đối tượng và xác định Comparator
thích hợp cho lớp học của bạn có tính đến các quy tắc được mô tả. Hàng đợi sử dụng một đống ưu tiên sẽ quản lý việc duy trì các đối tượng được sắp xếp theo mức ưu tiên khi chúng được chèn vào.
Sử dụng một cấu trúc lớp như thế này ... (tha thứ Java cẩu thả ... Tôi là một anh chàng C#)
public class PersonPreference
{
public Preference preference;
public int rank;
}
Sau đó, cho phép người dùng sắp xếp ưu tiên của họ (vì thế, cột thứ hạng), và đặt hàng trên thuộc tính/cột đó khi cần thiết.
EDIT
Nhìn vào này một lần nữa, tôi muốn xác định lại lớp học của tôi. Tùy chọn phải giống như của người dùng so với một người dùng khác như ...
public class PersonLike
{
public string like;
public int rank;
}
Lớp mới này xác định thứ gì đó mà một người thích và cho phép xếp hạng để bạn có nhiều trường hợp của lớp này (hoặc đại diện dữ liệu của nó), chúng có thể được xếp hạng, mà trong ảnh hưởng, tạo ra sở thích, bởi vì một sở thích về bản chất là một người dùng thích cái gì đó hơn cái gì khác. Bản thân nó không phải là sở thích bởi vì nó không được so sánh với bất kỳ thứ gì khác.
Cách tiếp cận này cho phép các lợi ích n được xếp hạng với nhau tạo ra một tập hợp các tùy chọn lớn.
'cho phép người dùng của bạn sắp xếp tùy chọn của họ .. 'đây là nhiều hơn hoặc ít hơn những gì tôi đang hỏi. Ngoài ra, 'Sở thích' là gì? – Cratylus
Sở thích có thể là bất cứ điều gì .... nhưng nhìn vào câu hỏi của bạn một lần nữa, tôi nghĩ rằng làm cho một chuỗi hình thức miễn phí sẽ tốt hơn. Bằng cách đó, họ có thể nhập "Pizza" hoặc "Spaghetti", v.v., – ctorx
Câu hỏi được cập nhật với nhiều chi tiết hơn về định nghĩa Tùy chọn – ctorx
Preference
nói chung là một thực thể hoàn chỉnh, mặc dù sẽ không có bất kỳ ý nghĩa nào trừ khi nó được liên kết với bất kỳ Person
nhưng có thể tự hoạt động.
Theo ưu tiên ưu tiên, Preference
không có bất kỳ ưu tiên Omelet, Pizza nào giống nhau, nhưng nó có ưu tiên khi được liên kết với một người (nói rằng tôi thích Pizza hơn món trứng tráng, tùy thuộc vào tôi không phải trên Pizza hoặc Omelet).
Vì vậy, bạn có đối tượng Preference
và Person
.
Tuỳ chọn bây giờ sẽ thay đổi từ Person sang Person để bạn sẽ liên kết Sở thích với người.
Kể từ ưu tiên là rất nhiều phụ thuộc vào người bạn có nhiều lựa chọn để đạt được:
- Sử dụng PriorityQueue - Trong khi thêm Preference gán ưu tiên. Hàng đợi này sẽ có mặt trong lớp Person
- Sử dụng Công cụ so sánh tùy chỉnh (Theo đề xuất của @assylias)
- Thêm quy tắc vào tùy chọn (dựa trên vị trí, giới tính, v.v) và có quy tắc được định cấu hình trước khi đưa ra tiêu chí nhất định tùy chọn được tính theo Hệ thống, mặc dù có ghi đè thủ công điều này. Trong trường hợp này, bạn chỉ có thể sử dụng
PriorityQueue
.
- 1. Cách tốt nhất để xuất các đối tượng hàm trong Java là gì?
- 2. Cách thực hành tốt nhất để đặt tên các thuộc tính là đối tượng là gì?
- 3. Cách tốt nhất để tuần tự hóa các đối tượng JavaScript thành XML là gì?
- 4. Cách tốt nhất để phát hiện màu trắng là gì?
- 5. các bước trong phát hiện đối tượng là gì?
- 6. Cách tiếp cận tốt nhất để chuyển đổi các đối tượng bất biến thành các đối tượng có thể thay đổi (đệ quy) là gì?
- 7. Cách tốt nhất để lưu trữ đối tượng ActiveRecord trong memcached là gì?
- 8. Cách tốt nhất để phân tách các mối quan tâm đối với mã này là gì?
- 9. Cách tốt nhất để thực hiện "hẹn giờ" là gì?
- 10. Thuật toán tốt nhất để phát hiện xung đột hiệu quả giữa các đối tượng
- 11. Cách tốt nhất để thể hiện danh sách bất biến trong .NET là gì?
- 12. Cách tốt nhất để gửi một đối tượng qua mạng bằng Python là gì?
- 13. MVC3: Cách tốt nhất để có được đường dẫn xem từ đối tượng HtmlHelper là gì?
- 14. Cách tốt nhất để biến đối tượng proxy EF thành đối tượng POCO ban đầu là gì?
- 15. Cách tốt nhất để hợp nhất hai đối tượng trong thời gian chạy bằng C# là gì?
- 16. Cách tốt nhất để thực hiện các giao thức là gì?
- 17. Cách tốt nhất để lấy cây của các đối tượng được lưu trữ trong RDBMS
- 18. Cách tốt nhất để loại bỏ các bản sao trong một mảng trong Java là gì?
- 19. Cách tốt nhất để giả lập đối tượng bên thứ 3 bằng ruby là gì?
- 20. Giải thích tốt về mô hình đối tượng ruby - chủ yếu là 'các lớp là đối tượng'?
- 21. Cách dễ nhất để duy trì các đối tượng java là gì?
- 22. Cách tốt nhất để thể hiện số lượng lớn tùy ý trong c là gì?
- 23. Cách tốt nhất để ánh xạ các yêu cầu đối với các tính năng trong Redmine là gì?
- 24. Phương pháp tốt nhất để phát hiện đối tượng trong video chuyển động có độ phân giải thấp là gì?
- 25. Cách tốt nhất để chia sẻ các tệp nguồn Delphi giữa các dự án là gì?
- 26. Cách tốt nhất để lấy URL hiện tại trong Spring MVC là gì?
- 27. Các công cụ mã nguồn mở tốt nhất để phát triển các ứng dụng Flash là gì? Những nơi tốt nhất để bắt đầu học là gì?
- 28. Cách tốt nhất để chia sẻ các cá thể đối tượng nghiệp vụ giữa các ứng dụng web Java bằng JBoss và Spring là gì?
- 29. Cách tốt nhất để thay thế các liên kết bằng các hàm JS là gì?
- 30. Yêu cầu đối tượng, ưu và nhược điểm là gì?
Bạn có nghĩa là mỗi 'Person' có' PriorityQueue' được liên kết? Ngoài ra, nếu tôi cần tùy chọn thứ 2 thay vì tùy chọn 'max' cho một số lý do trong một số phần của luồng? – Cratylus
Không, đặt tất cả những người trong hàng đợi ưu tiên _one_, thứ tự của hàng đợi sẽ là thứ tự ưu tiên của họ. Nếu bạn cần thứ hai cao nhất, sau đó pop hai người từ hàng đợi. Đó là tất cả về cách [heaps] (http://en.wikipedia.org/wiki/Heap_ (data_structure)) làm việc, hãy xem liên kết. –
Ý bạn là gì? Đặt tất cả những người trong một hàng đợi ưu tiên'? Đây có phải là 'hàng đợi ưu tiên' cho' pizza' chẳng hạn? PQ này có thuộc về một đối tượng không? – Cratylus