0

ペアの要素をシャッフルする方法は? 以下のプログラムは、すべての可能なペアを生成し、後でペアをシャッフルします。たとえば、シャッフル前の可能なペアは、 ..etcab,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;
    }
}
4

2 に答える 2

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>など。おそらく必要なのは、次のような 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;
     }
  }
于 2010-04-13T04:56:47.870 に答える
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
于 2010-04-13T04:57:27.883 に答える