2009-04-30 16 views
30

हो सकता है मेरे पास ऑब्जेक्ट्स की एक सरणी है जिसे मुझे एक स्थिति विशेषता द्वारा क्रमबद्ध करने की आवश्यकता है जो एक पूर्णांक या शून्य हो सकता है, और मुझे उन ऑब्जेक्ट्स की आवश्यकता है जिनके पास शून्य स्थिति है सरणी के अंत में हो। अब, मैं स्थिति को शून्य के बजाए कुछ मूल्य वापस करने के लिए मजबूर कर सकता हूं ताकि array.sort विफल न हो, लेकिन यदि मैं 0 को इस डिफ़ॉल्ट के रूप में उपयोग करता हूं, तो यह उन वस्तुओं को क्रम के सामने रखता है। इस तरह से करने का सबसे अच्छा तरीका क्या है? क्या मुझे सिर्फ कुछ हद तक नील मानों को कुछ हास्यास्पद उच्च संख्या में सेट करना चाहिए जो 'लगभग' हमेशा अंत में होने की गारंटी है? या क्या कोई अन्य तरीका है कि मैं array.sort विधि को सरणी के अंत में शून्य विशेषता ऑब्जेक्ट्स डालने का कारण बन सकता हूं? अबएक विशेषता द्वारा ऑब्जेक्ट्स की रूबी सरणी को सॉर्ट करना जो

class Parent 
    def sorted_children 
    children.sort{|a, b| a.position <=> b.position} 
    end 
end 

class Child 
    def position 
    category ? category.position : #what should the else be?? 
    end 
end 

, अगर मैं 1000000000 तरह 'शेष' कुछ करना है, तो यह सबसे अधिक संभावना वाला उन्हें सरणी के अंत में डाल दिया है, लेकिन यह है के रूप में मैं इस समाधान पसंद नहीं है: कोड इस तरह दिखता है मनमाने ढंग से

उत्तर

14

कैसे Child<=> परिभाषित करने में category के रूप में हमेशा एक category के साथ उन लोगों की तुलना में अधिक के बिना पर category.position अगर category मौजूद आधारित होना करने के बारे में है, और छँटाई आइटम?

class Child 
    # Not strictly necessary, but will define other comparisons based on <=> 
    include Comparable 
    def <=> other 
    return 0 if !category && !other.category 
    return 1 if !category 
    return -1 if !other.category 
    category.position <=> other.category.position 
    end 
end 

फिर Parent में आप सिर्फ children.sort कॉल कर सकते हैं।

+3

मैं इस पर कुछ हद तक iffy होगा क्योंकि यह असंगत होने के बिना किसी और चीज को सॉर्ट करने की आपकी क्षमता को सीमित करता है। ऐसा कहा जा रहा है, यदि स्थिति माता-पिता के लिए प्राकृतिक प्रकार का क्रम है, तो यह इस तरह से करने के लिए उचित मात्रा में समझ में आता है। – RHSeeger

+0

@RHSeeger यदि आप संपादन इतिहास की जांच करते हैं, तो मैंने मूल रूप से विभिन्न मानदंडों द्वारा क्रमबद्ध करने की आवश्यकता होने पर क्या करना है, इसके बारे में एक चेतावनी जोड़ दी थी, लेकिन यह भ्रमित रूप से शब्द था और मुझे नहीं लगता था कि इसमें बहुत कुछ जोड़ा गया है। असल में, आप जो भी चाहें नामित अन्य तुलना विधियों को जोड़ सकते हैं, और यदि आपको उन पर सॉर्ट करने की आवश्यकता है, तो इसे मूल उदाहरण की तरह ब्लॉक में करें। –

1

मैं रूबी एक समय में नहीं किया है, लेकिन आप छंटाई से अशक्त की जाँच विभाजित सकता है (और सिर्फ बाल # स्थिति अशक्त लौटने की अनुमति देने):

def sorted_children 
    children.reject{|c| c.position.nil?}.sort_by(&:position) + 
    children.select{|c| c.position.nil?} 
end 

वैसे यह सबसे नहीं है कुशल समाधान, लेकिन इसमें कोई जादू संख्या नहीं है।

+0

सीपीशन सही है क्योंकि iff c.position शून्य नहीं है, लेकिन आप इसे पठनीयता के लिए छोड़ सकते हैं। मुझें यह पसंद है! – glenra

+0

मुझे लगता है कि इस मामले में यह सच है, क्योंकि "स्थिति" शायद एक संख्या है, लेकिन चूंकि रुबी के पास 2 "झूठे" मान हैं (शून्य और झूठे), मैं यह मानने की कोशिश नहीं करता कि गैर-शून्य का मतलब सच है। मैं इससे पहले काटा गया है। :-) – Ken

6

निष्पक्ष होने के लिए, मैं रूबी से बहुत परिचित नहीं हूं, इसलिए इसे कोड कोड के बजाए एल्गोरिदम विचार के रूप में अधिक ले जाएं ... और ऑपरेटर को फिर से लिखना चाहिए: ऑपरेटर जिसे रूबी के पास क्लीनर है।

तुम सिर्फ तुलना में शून्य के लिए जाँच नहीं कर सकते:

class Parent 
    def sorted_children 
    children.sort{|a,b|(a and b) ? a <=> b : (a ? -1 : 1) } 
    end 
end 

Glenra के कोड है, जो मेरा रूप में, लेकिन कोड के एक छोटे (और शायद पढ़ने में आसान) राशि में एक ही बात लागू करता है उपयोग करने के लिए संपादित किया गया ।

88

मैं आपके पिछले प्रकार nil आइटम को अंतिम बार रखने के लिए ट्विक कर दूंगा। इस तरह कुछ कोशिश करो।

foo = [nil, -3, 100, 4, 6, nil, 4, nil, 23] 

foo.sort { |a,b| a && b ? a <=> b : a ? -1 : 1 } 

=> [-3, 4, 4, 6, 23, 100, nil, nil, nil] 

का कहना है कि: अगर ए और बी दोनों गैर-शून्य उन्हें सामान्य रूप से सॉर्ट लेकिन अगर उनमें से एक नहीं के बराबर है, एक स्थिति है कि सॉर्ट करता है कि एक बड़ा वापस जाएँ।

+2

धन्यवाद! यह स्वीकार्य उत्तर होना चाहिए। –

+3

सहमत हैं, यह स्वीकार्य उत्तर होना चाहिए। यदि आप सच्चे और झूठे मूल्यों पर भरोसा करते हुए खुश हैं, तो आप इसे एक छोटा सा अंश प्राप्त कर सकते हैं: 'foo.sort {| a, b | एक <=> बी || (बी एंड ए 1) || -1} ' –

+0

मैं पूरे मॉडल पर स्पेसशिप (!) ऑपरेटर को ओवरराइड नहीं करना चाहता था, बस एक विशेष ऑपरेशन में, इसलिए यह मेरी ज़रूरत के लिए बहुत बेहतर है। – gfd

13

मैं इस तरह चीजों के इन प्रकार संभाल:

children.sort_by {|child| [child.position ? 0 : 1,child.position || 0]} 
+0

क्या आप इसे थोड़ा और समझा सकते हैं? ऐसा लगता है कि जब आप शून्य है, तो एक जादू संख्या के रूप में 0 का उपयोग कर रहे हैं, जो वैध नहीं हो सकता है क्योंकि स्थिति को 0 से अधिक परिभाषित नहीं किया गया है (यह एक उचित धारणा है, लेकिन यह आवश्यक नहीं है)। – RHSeeger

+1

नहीं, अंत में 0 शून्य पर <=> पर कॉल करने से बचने के लिए है। सरणी का पहला तत्व पहले से ही बीमा करता है कि सभी शून्य सभी वैध पदों के बाद आ जाएंगे। पदों के साथ चीजों के बीच दूसरा तत्व subsorts। आप निल्स के साथ लोगों को कम करने के लिए वहां कुछ डाल सकते हैं, लेकिन उदाहरण ने कुछ भी नहीं बुलाया, इसलिए मैंने अभी 0 का उपयोग किया। यह 42 या "गर्भपात" हो सकता है, इससे कोई फर्क नहीं पड़ता। –

+0

आह, ठीक है, भ्रम रूबी ज्ञान की कमी के कारण था। क्या मैं सही ढंग से समझ रहा हूं कि आप वास्तव में दो मानों की एक सरणी/सूची बना रहे हैं, 1 और मान के लिए मान शून्य है ... या 0 और मान यदि मान गैर-शून्य है ... तो उपयोग करके सॉर्ट करना वह जोड़ी "क्रमबद्ध करने के लिए मूल्य" के रूप में? निफ्टी विचार, यह सिर्फ मुझे स्पष्ट नहीं था क्योंकि मैंने वाक्यविन्यास को पहचाना नहीं था। – RHSeeger

1

आप एक नया तुलना विधि को परिभाषित करते हुए अंतरिक्ष यान ऑपरेटर अधिभावी के बिना यह कर सकते हैं।

class Child 
    include Comparable 
    def compare_by_category(other) 
    return 0 if !category && !other.category 
    return 1 if !category 
    return -1 if !other.category 
    category.position <=> other.category.position 
    end 
end 

sort विधि एक ब्लॉक ले जा सकते हैं, ताकि आप तो तरह इस नई विधि का उपयोग कर सकते हैं: "? .nil"

children.sort {|a,b| a.compare_by_category(b) } 
+0

धन्यवाद बीआरओ, सहायक +1 – rusllonrails

संबंधित मुद्दे

 संबंधित मुद्दे