如何洗牌对

时间:2010-04-13 04:42:43

标签: java list arraylist generator shuffle

如何改变成对中的元素? 下面的程序,生成所有可能的对,然后将这些对洗牌。 例如shuffle之前的可能对是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;
    }
}

2 个答案:

答案 0 :(得分:1)

在将temp列表添加到pic2之前,您只需将其重新排列。以下是固定代码(请注意,我将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"等。在此版本中,我将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;
     }
  }

答案 1 :(得分: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