दो ArrayLists को एक ही अंदाज़ में यादृच्छिक कैसे करें?


257

मेरे पास दो सरणी सूची है filelistऔर imgListजो एक-दूसरे से संबंधित हैं, उदाहरण के लिए "e1.jpg" से संबंधित "H1.txt"। की यादृच्छिकता के imgListअनुसार सूची को स्वचालित रूप से कैसे यादृच्छिक किया जाए fileList? जैसे एक्सेल में, यदि हम कुछ कॉलम को सॉर्ट करते हैं, तो दूसरा कॉलम अपने आप फॉलो हो जाएगा?

String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"};
ArrayList<String> fileList = new ArrayList<String>(Arrays.asList(file));

String [] img = {"e1.jpg","e2.jpg","e3.jpg","e4.jpg","e5.jpg","e6.jpg"};
ArrayList<String> imgList = new ArrayList<String>(Arrays.asList(img));

//randomized files
Collections.shuffle(fileList);

रैंडमाइजेशन के बाद आउटपुट जैसे:

fileList = {"M4.txt","M6.txt","H3.txt","M5.txt","H2.txt","H1.txt"};

इरादा उत्पादन:

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};

जवाबों:


585

एक ही बीज के Collections.shuffle()साथ दो Randomवस्तुओं के साथ दो बार उपयोग करें :

long seed = System.nanoTime();
Collections.shuffle(fileList, new Random(seed));
Collections.shuffle(imgList, new Random(seed));

Randomएक ही बीज के साथ दो वस्तुओं का उपयोग करना सुनिश्चित करता है कि दोनों सूचियों को एक ही तरह से फेरबदल किया जाएगा। यह दो अलग-अलग संग्रहों के लिए अनुमति देता है।


121

उन्हें दूसरे वर्ग में लपेटें ताकि आप एक सरणी या Listउन वस्तुओं के साथ समाप्त कर सकें ।

public class Data {
    private String txtFileName;
    private String imgFileName;

    // Add/generate c'tor, getter/setter, equals, hashCode and other boilerplate.
}

उपयोग उदाहरण:

List<Data> list = new ArrayList<Data>();
list.add(new Data("H1.txt", "e1.jpg"));
list.add(new Data("H2.txt", "e2.jpg"));
// ...

Collections.shuffle(list);

10
यह जावा, ऑब्जेक्ट ओरिएंटेड सॉल्यूशन है। शायद, यह कैसे किया जाना चाहिए ... :)
इवान

22

सबसे सरल तरीका यह है कि दो मानों को एक साथ एक प्रकार में एन्क्रिप्ट किया जाए, जिसमें छवि और फ़ाइल दोनों हों। फिर एक निर्माण ArrayListकी है कि और यह शफ़ल।

इससे एनकैप्सुलेशन में भी सुधार होता है, जिससे आपको वह संपत्ति मिलती है जो आपके पास हमेशा फाइलों की एक ही संख्या होती है जैसे कि छवियाँ।

एक विकल्प यदि आप वास्तव में उस विचार को पसंद नहीं करते हैं तो फेरबदल कोड को स्वयं लिखना होगा ( जावा में संशोधित फिशर-येट्स फेरबदल के बहुत सारे उदाहरण हैं , जिनमें स्टैक ओवरफ्लो मैं कई पर संदेह सहित) और बस दोनों सूचियों पर काम करता है उसी समय। लेकिन मैं दृढ़ता से "इनकैप्सुलेशन में सुधार" दृष्टिकोण के साथ जाने की सलाह दूंगा।


11

आप नक्शे के साथ ऐसा कर सकते हैं:

Map<String, String> fileToImg:
List<String> fileList = new ArrayList(fileToImg.keySet());
Collections.shuffle(fileList);
for(String item: fileList) {
    fileToImf.get(item);
}

यह यादृच्छिक क्रम में छवियों के माध्यम से पुनरावृति करेगा।


5

यह फेरबदल विधि का उपयोग करके किया जा सकता है:

private List<Integer> getJumbledList() {
     List<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(8);
        myArrayList2.add(4);
        myArrayList2.add(9);
        Collections.shuffle(myArrayList2);
        return myArrayList2;

4

स्ट्रिंग्स के दो एरे होने के बजाय, कस्टम क्लास का एक एरे है जिसमें आपके दो स्ट्रिंग्स हैं।


3

आप 0 से 5 की संख्या वाली एक सरणी बना सकते हैं और उन पर फेरबदल कर सकते हैं। फिर परिणाम को "ओल्डइंडेक्स -> न्यूइंडेक्स" की मैपिंग के रूप में उपयोग करें और इस मैपिंग को अपने मूल सरणियों दोनों पर लागू करें।


2

पूरी तरह से निश्चित नहीं है कि आप "स्वचालित रूप से" से क्या मतलब है - आप एक कंटेनर ऑब्जेक्ट बना सकते हैं जो दोनों वस्तुओं को रखता है:

सार्वजनिक वर्ग FileImageHolder {स्ट्रिंग फ़ाइलनाम; स्ट्रिंग छविनाम; // TODO: यहां सामान डालें}

और फिर उसे एक अरै लिस्ट में डाल दें और उस ऐरे लिस्ट को रैंडमाइज करें।

अन्यथा, आपको प्रत्येक तत्व को एक सूची में स्थानांतरित करने का ट्रैक रखने की आवश्यकता होगी, और इसे दूसरे में भी स्थानांतरित करना होगा।


2

जब तक कि उन्हें फेरबदल करने के बाद तत्वों के पुराने सूचकांक को पुनः प्राप्त करने का कोई तरीका नहीं है, मैं इसे दो तरीकों में से एक करूँगा:

ए) एक और सूची बनाएं मल्टी_फलर = [0, 1, 2, ..., file.size ()] और इसे फेरबदल करें। अपनी फेरबदल फ़ाइल / छवि सूचियों के लिए आदेश प्राप्त करने के लिए इस पर लूप करें।

ArrayList newFileList = नया ArrayList (); ArrayList newImgList = new ArrayList (); के लिए (i = 0; i)

या बी) फ़ाइल / छवि नामों को रखने के लिए एक स्ट्रिंगरवेयर क्लास बनाएं और उन दो सूचियों को संयोजित करें जिन्हें आप पहले से ही एक में मिला चुके हैं: ArrayList jointList;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.