2010-02-12 10 views
36

मुझे हाल ही में यह सुनिश्चित करने की आवश्यकता है कि मेरी सूची क्रम में नहीं है। हाइबरनेट सही क्रम में इसे वापस करने के लिए काफी अच्छा था। मूर्खतापूर्ण हाइबरनेट, मेरे दिमाग को नहीं पढ़ रहा है।जावा का संग्रह। शफल क्या कर रहा है?

मैं अपने जावा एपीआई को देखा और यह मुझसे कहता है इसकी फेरबदल विधि से करता है:

बेतरतीब ढंग से अनियमितता की डिफ़ॉल्ट स्रोत का उपयोग निर्दिष्ट सूची permutes।

उत्सुक जॉर्ज होने के नाते, मैं जानना चाहता हूं कि इसका क्या अर्थ है। क्या कोई गणित पाठ्यक्रम है जिसे मैं सीखने के लिए ले सकता हूं? क्या मैं कोड देख सकता हूं? जावा, आप मेरे ऐरेलिस्ट में क्या कर रहे हैं?!?!

अधिक विशिष्ट होने के लिए, यहां गणित अवधारणाओं का उपयोग किया जा रहा है?

+0

+1 यह पहचानने के लिए कि इस प्रश्न को पूछने का कारण जिज्ञासा था, क्योंकि यह आपके द्वारा उपयोग किए जाने से पहले एक विधि कैसे काम करता है, इस बारे में सभी विवरण जानना महत्वपूर्ण है। – MatrixFrog

+2

ब्लोच एंड गफ्टर के जावा पज़लर में शफल के बारे में कुछ चर्चा है। –

उत्तर

45

हां, आप कोड देख सकते हैं; यह मूल रूप से Fisher-Yates shuffle करता है। यहाँ यह (धन्यवाद OpenJDK, और खुला स्रोत :-P के लिए Yay) है:

public static void shuffle(List<?> list, Random rnd) { 
    int size = list.size(); 
    if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) { 
     for (int i=size; i>1; i--) 
      swap(list, i-1, rnd.nextInt(i)); 
    } else { 
     Object arr[] = list.toArray(); 

     // Shuffle array 
     for (int i=size; i>1; i--) 
      swap(arr, i-1, rnd.nextInt(i)); 

     // Dump array back into list 
     ListIterator it = list.listIterator(); 
     for (int i=0; i<arr.length; i++) { 
      it.next(); 
      it.set(arr[i]); 
     } 
    } 
} 

स्वैप विधि:

private static void swap(Object[] x, int a, int b) { 
    Object t = x[a]; 
    x[a] = x[b]; 
    x[b] = t; 
} 
+0

आह दाएं, ओपनजेडीके। ठीक है, तो "क्या मैं कोड देख सकता हूं" सवाल मूर्ख था :)। धन्यवाद। – Stephano

+0

हाँ! :-) तो, अब आपको फिशर-येट्स शफल पर पढ़ने की जरूरत है, और आप सब तैयार हैं। :-) –

6

Collections JavaDoc इस्तेमाल किया फेरबदल विधि के बारे में कुछ जानकारी देता है।

यह कार्यान्वयन पिछली तत्व से दूसरे तक की सूची को पीछे की ओर ले जाता है, बार-बार "वर्तमान स्थिति" में यादृच्छिक रूप से चयनित तत्व को स्वैप कर देता है। तत्वों को सूची के उस हिस्से से यादृच्छिक रूप से चुना जाता है जो पहले तत्व से वर्तमान स्थिति तक चलता है, समावेशी।

तो यह अंत में शुरू होता है और सूची को पीछे की तरफ चलता है। प्रत्येक तत्व पर यह सूची से पहले के तत्व के साथ वर्तमान तत्व को रोकता है और स्वैप करता है। इस मामले में "यादृच्छिकता का डिफ़ॉल्ट स्रोत" शायद एक डिफ़ॉल्ट बीज के साथ बनाई गई Random ऑब्जेक्ट है।

+1

यह यादृच्छिक int कैसे प्राप्त हो रहा है? – Stephano

+1

जहां "पूर्ववर्ती" एक गैर-सख्त विविधता है (यानी, प्रत्येक पुनरावृत्ति किसी आइटम को स्वयं के साथ स्वैप कर सकती है)। :-P –

+1

@Stephano: यदि आप 'रैंडम' ऑब्जेक्ट निर्दिष्ट नहीं करते हैं, तो यह 'new java.util.Random()' का उपयोग करेगा। (यह निर्दिष्ट नहीं है; ओपनजेडीके संस्करण कैसे काम करता है।) –

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