İki ArrayList'i aynı şekilde rastgele nasıl sıralayabilirim?


257

Ben iki arraylist var filelistve imgListbirbirleri ile ilgili, örneğin "e1.jpg" ile ilgili "H1.txt". Listesinin randomizasyonuna imgListgöre otomatik olarak nasıl randomize edilir fileList? Excel'de olduğu gibi, belirli bir sütunu sıralarsak, diğer sütun otomatik olarak takip eder mi?

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);

randomizasyondan sonraki çıktı örneğin:

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

amaçlanan çıktı:

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

Yanıtlar:


585

Aynı tohumla başlatılmış Collections.shuffle()iki Randomnesne ile iki kez kullanın :

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

RandomAynı tohumla iki nesne kullanmak , her iki listenin de aynı şekilde karıştırılmasını sağlar. Bu, iki ayrı koleksiyona izin verir.


121

Tek bir dizi veya Listbu nesnelerle sonuçlanabilmeniz için bunları başka bir sınıfa sarın .

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

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

Kullanım örneği:

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
Bu, Java, nesne yönelimli bir çözümdür. Belki de nasıl yapılmalı ... :)
Evan

22

En basit yaklaşım, iki değeri hem görüntüye hem de dosyaya sahip olan bir türe dönüştürmektir. Sonra bir inşa ArrayListiçinde olduğunu ve bunu karıştırmak.

Bu da kapsüllemeyi geliştirir ve size her zaman otomatik olarak görüntülerle aynı sayıda dosyaya sahip olacağınız özelliği verir.

Bu fikri gerçekten beğenmezseniz bir alternatif , shuffle kodunu kendiniz yazmak ( Java'da değiştirilmiş bir Fisher-Yates shuffle'ın çok sayıda örneği var, birkaçını Overflow Over şüpheli de dahil olmak üzere) ve her iki listede de çalışmak Aynı zaman. Ancak, "kapsüllemeyi iyileştirme" yaklaşımıyla devam etmenizi şiddetle tavsiye ederim.


11

Bunu haritalarla yapabilirsiniz:

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

Bu, görüntüler arasında rastgele sırayla yinelenir.


5

Bu, shuffle yöntemi kullanılarak yapılabilir:

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

İki dizi dizesi yerine, iki dizenizi içeren bir özel sınıf dizisine sahip olun.


3

0 ile 5 arasındaki sayıları içeren bir dizi oluşturabilir ve bunları karıştırabilirsiniz. Ardından sonucu "oldIndex -> newIndex" eşlemesi olarak kullanın ve bu eşlemeyi her iki orijinal dizinize de uygulayın.


2

"Otomatik" ile ne demek istediğinizden tam olarak emin değilim - her iki nesneyi de içeren bir konteyner nesnesi oluşturabilirsiniz:

genel sınıf FileImageHolder {String fileName; Dize imageName; // YAPILACAKLAR: buraya şeyler ekleyin}

Sonra bunu bir dizi listesine koyun ve dizi listesini rastgele seçin.

Aksi takdirde, her bir öğenin bir listede nereye taşındığını izlemeniz ve diğerinde taşımanız gerekir.


2

Karıştırıldıktan sonra öğelerin eski dizinini almanın bir yolu yoksa, bunu iki yoldan biriyle yaparım:

A) Başka bir liste yapmak multi_shuffler = [0, 1, 2, ..., file.size ()] ve karıştırın. Karıştırılmış dosya / resim listeleriniz için sipariş almak üzere üzerine gelin.

ArrayList newFileList = yeni ArrayList (); ArrayList newImgList = yeni ArrayList (); için (i = 0; i

veya B) Dosya / görüntü adlarını tutmak için bir StringWrapper sınıfı oluşturun ve önceden aldığınız iki listeyi birleştirin: ArrayList combinedList;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.