2012-05-01 25 views
6

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

1

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.).

1

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.

+0

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

+0

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. –

+0

Ý 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

1

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.

+0

'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

+0

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

+0

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

1

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 PreferencePerson.

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:

  1. 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
  2. Sử dụng Công cụ so sánh tùy chỉnh (Theo đề xuất của @assylias)
  3. 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.
Các vấn đề liên quan