切換
舊版
前往
大廳
主題

(java)印出所有排列組合

深海異音 | 2014-09-26 03:23:50 | 巴幣 1019 | 人氣 5082


//  印出所有排列組合的類別
class
  Permutations<T>  {

      public  Permutations(T  obj)  {//  泛型(支援任何陣列、集合、字串)

             if  (obj  instanceof  Collection) {// 如果是集合,就轉成Object陣列

                   Object[]  o  =  new  Object[((Collection)  obj).size()];
                   int  i  =  0;
                   for  (Object x  :  (Collection)  obj)
                          o[i++]  =  x;

                   int  len  =  ((Collection)  obj).size() -  1;
                   perm(o,  0,  len);

             } else  if  (obj  instanceof  String) {//如果是字串,就切割成Object陣列

                   String[]  s  =  ((String) obj).split("");
                   
                   String[]  s2  =  new  String[s.length  -  1];//第一個是空白,所以必須去掉
                   for  (int  i  =  0;  i  <  s2.length;  i++)
                          s2[i]  =  s[i  +  1];

                   int  len  =  ((Object[]) s2).length  -  1;
                   perm((Object[])  s2,  0,  len);

             }
             else  {//  任何陣列都可以直接轉換成Object陣列

                   int  len  =  ((Object[]) obj).length  -  1;
                   perm((Object[])  obj,  0,  len);

             }
      }

      private  void  perm(Object[] list,  int  k,  int  m)  {

             if  (k  ==  m)  {//  印出行

                   for  (int  i  =  0;  i  <=  m;  i++)
                          System.out.print(list[i]  +  " ");
                   System.out.println();

             } else  {//  繼續交換

                   for  (int  i  =  k;  i  <=  m;  i++)  {
                          swap(list,  k,  i);  //  交換
                          perm(list,  k  +  1,  m);  //  遞迴,後面2個參數相等表示可印出
                          swap(list,  k,  i);  //  (因為是傳址呼叫,所以要換回來)
                   }

             }
      }

      private  void  swap(Object[] array,  int  x1,  int  x2)  {//  交換
             Object  z  =  array[x1];
             array[x1]  =  array[x2];
             array[x2]  =  z;
      }

}



使用方法很簡單,不管是 陣列、集合、字串,通通都可以使用




public  class  Test_1 {
      public  static  void  main(String[] args)  {
 
             System.out.println("一般陣列===========");
             String[]  array  =  {  "aa",  "bb",  "cccc"  };
             new  Permutations<String[]>(array);
             //
             //
             System.out.println("\n類別陣列===========");
             Cla[]  array2 =  new  Cla[3];
             for  (int  i  =  0;  i  <  array2.length;  i++)
                   array2[i]  =  new  Cla(i  +  "");
             new  Permutations<Cla[]>(array2);
             //
             //
             System.out.println("\n集合===========");
             ArrayList  array3 =  new  ArrayList();
             array3.add(81000);
             array3.add(3.14);
             array3.add("ㄎㄧㄤ");
             new  Permutations<ArrayList>(array3);
             //
             //
             System.out.println("\n字串===========");
             String  array4 =  "野格炸";
             new  Permutations<String>(array4);
 
      }
}
 
class  Cla  {
      String s;
 
      Cla(String s)  {
             this.s  =  s;
      }
 
      @Override
      public  String toString()  {//改寫toString,不然會引出記憶體位址
             return  s;
      }
}


送禮物贊助創作者 !
0
留言

創作回應

派帕學長的獒教父
這讓我想到高一數學
2014-09-26 10:50:53
貓貓風 ฅ●ω●ฅ
跟 C 的 template 一樣,支援所有資料型別
2014-10-13 17:17:08
哇酒量不好賣給哇衝康
想問怎麼在最後先印2 0 1 再印2 1 0 呢?
2022-09-23 02:06:56
深海異音
先用另一個ArrayList把輸出結果存起來,進行排序後再印出來
2022-09-23 02:17:02
哇酒量不好賣給哇衝康
感謝
2022-09-23 02:21:24

更多創作