Wie Paare mischen
Frage
Wie die Elemente in den Paaren mischen?
Das folgende Programm, erzeugen alle möglichen Paare und später die Paare mischen.
z.B. mögliche Paare vor shuffle ab,ac,ae,af
..etc Shuffled zu ac,ae,af,ab
... etc
Wie es nicht nur paarweise gemischt zu machen, aber innerhalb der Elemente in dem Paar selbst?
z.B. statt ab, ac,
wie kann ich ba, ac
machen?
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;
}
}
Lösung
Sie müssen nur die temp
Liste mischen, bevor Sie es zu pic2
hinzufügen. Hier ist der feste Code (beachten Sie, dass ich die pic2
Variable in ein Feld der ListGenerator
Klasse drehte sich um und benannte sie in 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;
}
}
Dies ist jedoch nur der erste Schritt in Richtung einer Lösung. Derzeit jedes Paar ganze Zahlen im Bereich [0..size-1]
enthalten, so dass Ihre Paare wie folgt aussehen: <0,3>
, <1,2>
usw. Was Sie wahrscheinlich wollen ein Paar bekommen, die aus zwei Buchstaben bestehenden String wie sind: "ab", "dc"
usw. In dieser Version I umbenannten getList()
zu getPairs()
die besser seine Bedeutung vermitteln. Auch machte ich den Konstruktor von ListGenerator
eine Reihe von Zeichen akzeptieren, so dass Sie es einfach anrufen müssen mit dem gewünschten Zeichen, wie folgt:
List<String> pairs = new ListGenerator('a', 'b', 'c', 'd', 'e', 'f', 'g').getPairs();
Und hier ist ListGenerator
es sich von selbst:
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;
}
}
Andere Tipps
Angenommen, Sie haben diese Objekte:
Red dress
Blue shirt
Pink panties
Und Sie wollen beide die Farben und die Artikel von Kleidung mischen, um Dinge wie:
Pink shirt
Blue panties
... etc
Wie Sie es tun?
Es ist wirklich ganz einfach. Nur mische die Liste der Farben und Gegenstände der Kleidung getrennt, und sie dann wieder beitreten
Red, Blue, Pink --> Pink, Blue, Red
dress, shirt, panties --> shirt, panties, dress
------------------------ pair
Pink shirt
Blue panties
Red dress