2010-04-13 105 views
0

如何洗牌成对的元素? 下面的程序,生成所有可能的配对,稍后再洗牌。 例如洗牌前可能的配对是ab,ac,ae,af ..等等洗牌到ac,ae,af,ab ...等如何洗牌对

如何使它不仅成对洗牌,而且在对本身的元素内? 例如而不是ab, ac,我该如何制作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; 
    } 
} 

回答

1

你必须将其添加到pic2之前洗牌temp列表。下面是固定的代码(注意,我把pic2可变进ListGenerator类的字段,并更名为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; 
    } 
    } 

然而这仅仅是迈向解决方案的第一步。目前,每一对将包含在[0..size-1]范围内的整数,因此您的配对看起来像这样:<0,3><1,2>等。您可能需要的是获得双字母字符串的对,例如:"ab", "dc"等。在此版本中,I将其更名为getList()getPairs(),其中意义更好。另外,我做的ListGenerator构造函数接受字符数组,所以你只需要使用所需的字符来称呼它,如下所示:

List<String> pairs = new ListGenerator('a', 'b', 'c', 'd', 'e', 'f', 'g').getPairs(); 

这里是ListGenerator它的自我:

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; 
    } 
    } 
+0

谢谢意大利:-) – Jessy 2010-04-13 05:25:54

0

让我们说你有这些对象:

Red dress 
Blue shirt 
Pink panties 

而且要洗牌两种颜色,衣物的物品得到的东西,如:

Pink shirt 
Blue panties 
... etc 

你是怎么做到的?

这很简单,真的:只需将洗涤物的颜色和物品分开洗涤,然后重新加入。

Red, Blue, Pink   --> Pink, Blue, Red 
dress, shirt, panties  --> shirt, panties, dress 
           ------------------------ pair 
           Pink shirt 
           Blue panties 
           Red dress