Come mescolare le coppie
Domanda
Come mescolare gli elementi nelle coppie?Il programma seguente genera tutte le coppie possibili e successivamente mescola le coppie.per esempio.possibili coppie prima dello shuffle ab,ac,ae,af
..ecc mescolato a ac,ae,af,ab
...eccetera
Come renderlo non solo mescolato in coppia ma all'interno degli elementi della coppia stessa?per esempio.invece di ab, ac,
come posso fare ba, ac
?
String[] pictureFile = {"a.jpg","b.jpg","c.jpg","d.jpg","e.jpg","f.jpg","g.jpg"};
List <String> pic1= Arrays.asList(pictureFile);
...
ListGenerator pic2= new ListGenerator(pic1);
ArrayList<ArrayList<Integer>> pic2= new ArrayList<ArrayList<Integer>>();
public class ListGenerator {
public ListGenerator(List<String> pic1) {
int size = pic1.size();
// create a list of all possible combinations
for(int i = 0 ; i < size ; i++) {
for(int j = (i+1) ; j < size ; j++) {
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(i);
temp.add(j);
pic2.add(temp);
}
}
Collections.shuffle(pic2);
}
//This method return the shuffled list
public ArrayList<ArrayList<Integer>> getList() {
return pic2;
}
}
Soluzione
Non vi resta che mescolare la lista temp
prima di aggiungerlo a pic2
. Ecco il codice fisso (nota che ho girato la variabile pic2
in un campo della classe ListGenerator
e ribattezzata a result
)
String[] pictureFile = {"a.jpg","b.jpg","c.jpg","d.jpg","e.jpg","f.jpg","g.jpg"};
List <String> pic1= Arrays.asList(pictureFile);
...
ListGenerator pic2= new ListGenerator(pic1);
public class ListGenerator {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
public ListGenerator(List<String> pic1) {
int size = pic1.size();
// create a list of all possible combinations
for(int i = 0 ; i < size ; i++) {
for(int j = (i+1) ; j < size ; j++) {
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(i);
temp.add(j);
Collections.shuffle(temp);
result.add(temp);
}
}
Collections.shuffle(result);
}
//This method return the shuffled list
public ArrayList<ArrayList<Integer>> getList() {
return result;
}
}
Tuttavia, questo è solo il primo passo verso una soluzione. Attualmente, ogni coppia conterrà numeri interi nella gamma [0..size-1]
in modo che le coppie di simile a questa: <0,3>
, <1,2>
, ecc Che probabilmente si desidera è di ottenere una coppia che sono due lettere String quali: "ab", "dc"
, ecc In questa versione ho getList()
rinominato getPairs()
che trasmettono meglio il suo significato. Inoltre, ho fatto il costruttore di ListGenerator
accetta un array di caratteri in modo che solo bisogno di chiamare con i tuoi caratteri desiderati, come segue:
List<String> pairs = new ListGenerator('a', 'b', 'c', 'd', 'e', 'f', 'g').getPairs();
E qui è ListGenerator
è di per sé:
public class ListGenerator {
ArrayList<String> result = new ArrayList<String>();
public ListGenerator(char... letters) {
int size = letters.length;
// create a list of all possible combinations
for(int i = 0 ; i < size ; i++) {
for(int j = (i+1) ; j < size ; j++) {
ArrayList<Character> temp = new ArrayList<Character>();
temp.add(letters[i]);
temp.add(letters[j]);
Collections.shuffle(temp);
result.add("" + temp[0] + temp[1]);
}
}
Collections.shuffle(result);
}
//This method return the shuffled list
public ArrayList<ArrayList<Integer>> getPairs() {
return result;
}
}
Altri suggerimenti
Diciamo che hai questi oggetti:
Red dress
Blue shirt
Pink panties
E vuoi mescolare sia i colori che gli articoli di abbigliamento per ottenere cose come:
Pink shirt
Blue panties
... etc
Come si fa?
È semplice, davvero:basta mescolare separatamente l'elenco dei colori e degli articoli di abbigliamento, quindi unirli nuovamente.
Red, Blue, Pink --> Pink, Blue, Red
dress, shirt, panties --> shirt, panties, dress
------------------------ pair
Pink shirt
Blue panties
Red dress