import cn.com.likeshow.util.ArrangeResultListener;
import cn.com.likeshow.util.Arrangement;
import cn.com.likeshow.util.Combination;
import cn.com.likeshow.util.CombinationResultListener;
import cn.com.likeshow.util.IndexOutOfBoundsException;
//先组合 后 排列 示例
public class test {
public static void main(String[] args) throws IndexOutOfBoundsException {
//创建排列对象时,把监听器传入,产生结果时会回调arrangeResult(int[] result)方法
final Arrangement arrangement=new Arrangement(new ArrangeResultListener() {
@Override
public void arrangeResult(int[] result) {
for(int i=0;i<result.length;i++)
System.out.print(result[i]+" ");
System.out.println();
}
});
//创建组合对象时,把监听器传入,产生结果时会回调combinationResult(int[] result) 方法
Combination combination=new Combination(new CombinationResultListener() {
@Override
public void combinationResult(int[] result) {
System.out.println("组合结果");
for(int i=0;i<result.length;i++)
System.out.print(result[i]+" ");
System.out.println("\n\n排列结果");
//设置参数.Arrangement.setArguement(int... arr)
arrangement.setArguement(result);
//开始执行
arrangement.execute();
System.out.println("==============\n");
}
});
//设置参数 setArguement(int selectCount, int... arr)
// throws IndexOutOfBoundsException
//selectCount小于1或大于数组长度时抛出异常
combination.setArguement(3,1,2,3,4,5);
//开始执行
combination.execute();
}
}
======================源码如下====================================
package cn.com.likeshow.util;
public class Arrangement {
private ArrangeResultListener arrangeResultListener;
private int[]arr;
public Arrangement(ArrangeResultListener arrangeResultListener){
this.arrangeResultListener=arrangeResultListener;
}
public void setArguement(int...arr){
this.arr=arr;
}
public void execute(){
int result[]=new int[arr.length];
boolean used[]=new boolean [arr.length];
DFS(arr,result,used,0, arr.length);
}
private void DFS(int[] arr, int[] result, boolean[] used, int layer, int size) {
if(layer==size){
int []res=new int[arr.length];
for(int i=0;i<size;i++){
res[i]=result[i];
}
arrangeResultListener.arrangeResult(res);
return;
}
for(int i=0;i<size;i++){
if(used[i]==false){
used[i]=true;
result[layer]=arr[i];
DFS(arr,result,used,layer+1, size);
used[i]=false;
}
}
}
}
package cn.com.likeshow.util;
public class Combination {
private CombinationResultListener combinationResultListener;
private int[]arr;
private int selectCount;
public Combination(CombinationResultListener combinationResultListener) {
this.combinationResultListener = combinationResultListener;
}
public void setArguement(int selectCount,int... arr) throws IndexOutOfBoundsException{
if(selectCount<1||selectCount>arr.length)
throw new IndexOutOfBoundsException(selectCount);
this.arr=arr;
this.selectCount=selectCount;
}
public void execute(){
int result[]=new int[arr.length];
DFS(arr,1,arr.length,selectCount,result,0);
}
private void DFS(int[] arr,int layer,int size,int selectCount,int[] result,int startIndexInThisLayer){
int i=0,k=0;
if(layer==selectCount){
for(i=startIndexInThisLayer;i<size;i++){
int[]integers=new int[selectCount];
for(k=0;k<layer-1;k++ ){
integers[k]=result[k];
}
integers[k]=arr[i];
combinationResultListener.combinationResult(integers);
}
return;
}
for(i=startIndexInThisLayer;i<size-selectCount+layer;i++){
result[layer-1]=arr[i];
DFS(arr,layer+1,size,selectCount,result,i+1);
}
}
}
package cn.com.likeshow.util;
public interface ArrangeResultListener {
public void arrangeResult(int[] result);
}
package cn.com.likeshow.util;
public interface ArrangeResultListener {
public void arrangeResult(int[] result);
}
package cn.com.likeshow.util;
public interface CombinationResultListener {
public void combinationResult(int[] result);
}
package cn.com.likeshow.util;
public class IndexOutOfBoundsException extends Exception {
private static final long serialVersionUID = 1615123678847500568L;
public IndexOutOfBoundsException(int len){
super(len+"");
}
}
jar包下载链接 http://pan.baidu.com/s/1kTIAg7P