डोमेन में प्राथमिकता/प्राथमिकताओं को मॉडल करने का सबसे अच्छा तरीका क्या है?
उदा। मान लें कि मेरे पास एक वर्ग Person
एक व्यक्ति का प्रतिनिधित्व करता है और इसमें कुछ प्राथमिकताएं हैं। PersonX
पिज्जा, स्पैगेटी और ओमेलीट पसंद करता है और वास्तव में वह पिज्जा पर स्पैगेटी पसंद करेंगे।
इन सर्वोत्तम मॉडल कैसे हैं?
पहला विचार उन्हें List
(Person
के सदस्य चर के रूप में) प्रविष्टि आदेश के अनुसार प्राथमिकता रखने के लिए होगा। सूची में पहला सबसे पसंदीदा है, फिर सूची में दूसरा सबसे दूसरा पसंदीदा इत्यादि है, लेकिन ऐसा लगता है कि यह बहुत कठिन हो रहा है। जैसे जब मैं वरीयताओं के लिए खोज या संघ करना चाहता हूं आदि
शायद इस तरह की समस्याओं के लिए एक मानक दृष्टिकोण है?वस्तुओं में प्राथमिकताओं/वरीयताओं का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?
उत्तर
आप के रूप में आप प्रस्तावित सूची का उपयोग करें और अपने व्यक्ति वर्ग के लिए एक विधि जोड़ सकता है कि एक Comparator<Preference>
जो उस व्यक्ति के लिए 2 वरीयताओं की तुलना करने में सक्षम हो जाएगा वापसी होगी: बस की जाँच करेगा
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);
और तुलनित्र आपकी सूची में वरीयता का सूचकांक (यदि इसमें वरीयता आदि शामिल है)।
आप वस्तु प्राथमिकताओं का प्रतिनिधित्व करने के लिए एक priority queue इस्तेमाल कर सकते हैं, और अपने वर्ग को ध्यान में नियमों में वर्णित लेता है के लिए एक उपयुक्त Comparator
परिभाषित करते हैं। कतार एक प्राथमिकता ढेर का उपयोग करती है जो प्राथमिकता द्वारा क्रमबद्ध वस्तुओं को बनाए रखने की देखभाल करेगी क्योंकि उन्हें डाला जा रहा है।
इस तरह एक वर्ग संरचना
public class PersonPreference
{
public Preference preference;
public int rank;
}
तो इसलिए, रैंक स्तंभ उनकी प्राथमिकताओं सॉर्ट करने के लिए (का प्रयोग करें ... (लापरवाही जावा क्षमा ... मैं एक सी # पुरुष हूँ), की अनुमति देने के लिए अपने उपयोगकर्ताओं को), और आवश्यक होने पर उस संपत्ति/कॉलम पर आदेश।
संपादित
इस को देखते हुए फिर से, मैं अपने वर्ग को फिर से परिभाषित करना चाहते हैं। वह प्राथमिकता, एक उपयोगकर्ता के तरह एक और तरह की तुलना में होना चाहिए ...
public class PersonLike
{
public string like;
public int rank;
}
इस नए वर्ग कुछ एक व्यक्ति को पसंद करता है परिभाषित करता है, और यह एक रैंक के लिए अनुमति देता है ताकि आप इस वर्ग के कई उदाहरण है जब (या एक इसके बारे में डेटा प्रतिनिधित्व), वे स्थान पर रहीं किया जा सकता है, जिसमें प्रभावित करते हैं,, वरीयता बनाता है क्योंकि एक प्राथमिकता अनिवार्य रूप से एक उपयोगकर्ता कुछ और अधिक कुछ पसंद है। अपने आप में एक तरह एक प्राथमिकता है क्योंकि यह कुछ और के खिलाफ तुलना नहीं की जा रही है नहीं है।
यह दृष्टिकोण की अनुमति देता है n हितों के लिए एक दूसरे को वरीयताओं का एक बड़ा संग्रह बनाने के खिलाफ रैंक किया है।
'अपने उपयोगकर्ताओं को उनकी वरीयताओं को क्रमबद्ध करने की अनुमति दें ..' यह मैं कम से कम पूछ रहा हूं। एक 'वरीयता' क्या है? – Cratylus
वरीयता कुछ भी हो सकती है .... लेकिन फिर से आपके प्रश्न को देखकर, मुझे लगता है कि इसे एक मुक्त फॉर्म स्ट्रिंग बनाना बेहतर होगा। इस तरह वे "पिज्जा" या "स्पेगेटी" आदि टाइप कर सकते हैं ...., – ctorx
वरीयता परिभाषा पर अधिक विशिष्टताओं के साथ अद्यतन प्रश्न – ctorx
Preference
पूरी तरह से एक पूर्ण इकाई है, हालांकि इसका कोई अर्थ नहीं होगा जब तक कि यह किसी भी Person
से संबद्ध न हो लेकिन वह स्वयं ही रह सके।
जहां तक पसंद प्राथमिकता का प्रश्न है, Preference
किसी भी प्राथमिकता आमलेट नहीं है, पिज्जा सब एक जैसे हैं, लेकिन यह एक प्राथमिकता है जब यह एक व्यक्ति के साथ जुड़ा हुआ है (जैसे कि मैं पिज्जा ऑमलेट की तुलना में अधिक पसंद है, मुझे पर निर्भर करता है पिज्जा या आमलेट पर नहीं)।
तो तुम एक Preference
और Person
वस्तु है।
अब व्यक्ति से व्यक्ति में वरीयता अलग-अलग होगी ताकि आप व्यक्ति के साथ वरीयता को जोड़ सकें।
के बाद से प्राथमिकता व्यक्ति पर बहुत ज्यादा निर्भर है कि आप को प्राप्त करने के अनेक विकल्प हैं:
- उपयोग PriorityQueue - जबकि जोड़ने पसंद प्राथमिकता आवंटित। (स्थान, लिंग, आदि के आधार पर) (@assylias द्वारा सुझाव दिया गया है) यह कतार व्यक्ति वर्ग ही
- उपयोग कस्टम तुलनाकारी में मौजूद रहेंगे
- पसंद करने के लिए नियम जोड़े और कॉन्फ़िगर नियम है जो जब कुछ मानदंडों को दी वापस आ जाएगी पूर्व की है सिस्टम द्वारा गणना की वरीयता, हालांकि इसका मैन्युअल ओवरराइड है। इस मामले में आप केवल
PriorityQueue
का उपयोग कर सकते हैं।
आपका मतलब है कि प्रत्येक व्यक्ति के पास 'प्राथमिकता क्यूयू' संबद्ध है? इसके अलावा अगर प्रवाह के कुछ हिस्सों में किसी कारण से 'अधिकतम' वरीयता के बजाय मुझे दूसरी वरीयता की आवश्यकता है तो क्या होगा? – Cratylus
नहीं, सभी व्यक्तियों को _one_ प्राथमिकता कतार में डालें, कतार का क्रम उनकी प्राथमिकताओं का क्रम होगा। यदि आपको दूसरे उच्चतम की आवश्यकता है, तो कतार से दो व्यक्तियों को पॉप करें। यह सब [हेप्स] (http://en.wikipedia.org/wiki/Heap_ (data_structure)) काम के बारे में है, लिंक पर एक नज़र डालें। –
क्या मतलब है 'सभी व्यक्तियों को एक प्राथमिकता कतार में रखें'? उदाहरण के लिए 'पिज्जा' के लिए यह 'प्राथमिकता कतार' है? क्या यह पीक्यू किसी ऑब्जेक्ट से संबंधित है? – Cratylus