डोमेन में प्राथमिकता/प्राथमिकताओं को मॉडल करने का सबसे अच्छा तरीका क्या है?
उदा। मान लें कि मेरे पास एक वर्ग 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
का उपयोग कर सकते हैं।
- 1. अपरिवर्तनीय वस्तुओं को परिवर्तनीय वस्तुओं (रिकर्सिव) में परिवर्तित करने का सबसे अच्छा तरीका क्या है?
- 2. .NET में एक अपरिवर्तनीय सूची का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?
- 3. SQL सर्वर सीई में एक टाइमपैन का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?
- 4. 2 डी साइड-स्क्रोलर में स्तरों का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?
- 5. ग्रीष्मकालीन समय नियमों का प्रतिनिधित्व करने का सबसे अच्छा तरीका क्या है?
- 6. क्या टाइमस्पेन के साथ दशकों का प्रतिनिधित्व करने का यह सबसे अच्छा तरीका है?
- 7. RedirectToAction का परीक्षण करने का सबसे अच्छा तरीका क्या है?
- 8. क्लोजर में जीयूआई करने का सबसे अच्छा तरीका क्या है?
- 9. सेलेनियम में पुनर्निर्देशन करने का सबसे अच्छा तरीका क्या है?
- 10. SQL डेटाबेस में रंग का प्रतिनिधित्व करने का सबसे अच्छा तरीका?
- 11. सीएसएस में 100% के 1/3 का प्रतिनिधित्व करने का सबसे अच्छा तरीका?
- 12. स्पैस बूलियन मैट्रिस का प्रतिनिधित्व करने और गुणा करने का सबसे तेज़ तरीका क्या है?
- 13. जावा में निहित ऑब्जेक्ट को अनुपूरक तरीकों का प्रतिनिधित्व करने का सबसे छोटा तरीका क्या है?
- 14. एचटीएमएल कक्षा नामों में कुंजी/मूल्य जोड़े का प्रतिनिधित्व करने का सबसे अच्छा तरीका
- 15. संग्रह से वस्तुओं को हटाने का सबसे अच्छा तरीका
- 16. रुझान डेटा संग्रहीत करने का सबसे अच्छा तरीका क्या है?
- 17. "टाइमर" को लागू करने का सबसे अच्छा तरीका क्या है?
- 18. लॉगिंग करने का सबसे अच्छा तरीका क्या है?
- 19. पायथन प्रिंट टॉगल करने का सबसे अच्छा तरीका क्या है?
- 20. AppEngine मॉडल Memcaching करने का सबसे अच्छा तरीका क्या है?
- 21. तालिका को समर्पित करने का सबसे अच्छा तरीका क्या है?
- 22. तारों को पार्स करने का सबसे अच्छा तरीका क्या है?
- 23. हस्ताक्षर ऑनलाइन कैप्चर करने का सबसे अच्छा तरीका क्या है?
- 24. एक बीन शुरू करने का सबसे अच्छा तरीका क्या है?
- 25. एकाधिक सबव्यूज़ व्यवस्थित करने का सबसे अच्छा तरीका क्या है?
- 26. सी # परियोजना आयोजित करने का सबसे अच्छा तरीका क्या है?
- 27. jQuery प्रदर्शन करने का सबसे अच्छा तरीका क्या है .change()
- 28. एनएसएमयूटेबलएरे को शफल करने का सबसे अच्छा तरीका क्या है?
- 29. एफ # कोड दस्तावेज करने का सबसे अच्छा तरीका क्या है?
- 30. डेटाबेस कॉपी करने का सबसे अच्छा तरीका क्या है?
आपका मतलब है कि प्रत्येक व्यक्ति के पास 'प्राथमिकता क्यूयू' संबद्ध है? इसके अलावा अगर प्रवाह के कुछ हिस्सों में किसी कारण से 'अधिकतम' वरीयता के बजाय मुझे दूसरी वरीयता की आवश्यकता है तो क्या होगा? – Cratylus
नहीं, सभी व्यक्तियों को _one_ प्राथमिकता कतार में डालें, कतार का क्रम उनकी प्राथमिकताओं का क्रम होगा। यदि आपको दूसरे उच्चतम की आवश्यकता है, तो कतार से दो व्यक्तियों को पॉप करें। यह सब [हेप्स] (http://en.wikipedia.org/wiki/Heap_ (data_structure)) काम के बारे में है, लिंक पर एक नज़र डालें। –
क्या मतलब है 'सभी व्यक्तियों को एक प्राथमिकता कतार में रखें'? उदाहरण के लिए 'पिज्जा' के लिए यह 'प्राथमिकता कतार' है? क्या यह पीक्यू किसी ऑब्जेक्ट से संबंधित है? – Cratylus