কীভাবে একই ফ্যাশনে দুটি অ্যারেলিস্টকে এলোমেলো করা যায়?


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

এগুলি অন্য শ্রেণিতে মুড়ে রাখুন যাতে আপনি একটি একক অ্যারে বা Listobjects অবজেক্টের সাথে শেষ করতে পারেন ।

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এর যে এবং এটি এলোমেলো।

এটি আপনার এনক্যাপসুলেশনকেও উন্নত করে এবং এমন সম্পত্তি দেয় যা আপনার কাছে স্বয়ংক্রিয়ভাবে চিত্রের মতো একই সংখ্যক ফাইল থাকবে have

বিকল্পটি যদি আপনি সত্যিই পছন্দ করেন না তবে নিজেরাই এই শাফল কোডটি লিখবেন ( জাভাতে পরিবর্তিত ফিশার-ইয়েটস বদলের প্রচুর উদাহরণ রয়েছে, স্ট্যাক ওভারফ্লো আমার সন্দেহজনক কয়েকটি সহ) এবং কেবলমাত্র উভয় তালিকায় অপারেটিং করুন একই সময়. তবে আমি দৃ strongly়ভাবে "এনক্যাপসুলেশন উন্নত করুন" পদ্ধতির সাথে যাওয়ার পরামর্শ দিচ্ছি।


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

আপনি "স্বয়ংক্রিয়ভাবে" বলতে কী বোঝায় তা সম্পূর্ণরূপে নিশ্চিত নয় - আপনি একটি ধারক বস্তু তৈরি করতে পারেন যা উভয় বস্তুকে ধারণ করে:

পাবলিক ক্লাস ফাইলমিজহোল্ডার {স্ট্রিং ফাইলের নাম; স্ট্রিং ইমেজনাম; // টডো: এখানে জিনিস stuffোকান}

এবং তারপরে এটিকে একটি অ্যারে তালিকায় রাখুন এবং সেই অ্যারে তালিকাটি এলোমেলো করে দিন।

অন্যথায়, আপনাকে প্রতিটি তালিকাগুলি একটি তালিকায় কোথায় স্থানান্তরিত হয়েছে সেগুলি ট্র্যাক করে রাখতে হবে এবং এটি অন্য একটিতেও স্থানান্তরিত করতে হবে।


2

উপাদানগুলি পরিবর্তিত হওয়ার পরে পুরাতন সূচকগুলি পুনরুদ্ধার করার উপায় না থাকলে আমি এটি দুটি উপায়ের একটি করে করব:

ক) অন্য তালিকাটি মাল্টি_শফলার = [0, 1, 2, ..., file.size ()] করুন এবং এটিকে পরিবর্তন করুন। আপনার বদলানো ফাইল / চিত্র তালিকার অর্ডার পেতে এটির উপর লুপ করুন।

অ্যারেলিস্ট newFileList = নতুন অ্যারেলিস্ট (); অ্যারেলিস্ট newImgList = নতুন অ্যারেলিস্ট (); (i = 0; i) এর জন্য

বা খ) ফাইল / চিত্রের নাম ধরে রাখতে স্ট্রিংগ্র্যাপার ক্লাস তৈরি করুন এবং আপনি ইতিমধ্যে দুটি তালিকায় একত্রিত হয়েছিলেন: অ্যারেলিস্ট সম্মিলিত তালিকা;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.