论坛首页 入门技术论坛

原创,对指定对象数组进行排列组合操作(组合操作)

浏览 2837 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-09-17  
新人报到帖,希望版主多多加些积分,绝对原创。
import java.util.List;
import java.util.Vector;


/**
 * @author bookong <levin_jiang@163.com>
 * @version 1.0, 2007-9-17
 * @since 1.5
 */
public class Test {
	public static void main(String[] args) {
		try {
			Object[] objs = new Object[6];
			for(int i=0; i<6; i++){
				objs[i] = String.valueOf(i);
				System.out.print(objs[i]+" ");
			}
			System.out.println();
			
			System.out.println("=====================");
			System.out.println("测试 C(6,4)");
			List<List<Object>> lists = new Test().permute(objs, 4);
			for(List<Object> list : lists){
				for(Object item : list){
					System.out.print(item);
				}
				System.out.println();
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 对对象数组进行组合操作
	 * @param objs 进行排列组合操作的对象数组
	 * @param count 每次取出的个数
	 * @return List<List<Object>> 结果集合
	 * @throws Exception
	 */
	public List<List<Object>> permute(Object[] objs, int count) throws Exception{
		if(objs == null){
			throw new Exception("参数'objs'不能为null");
		}
		
		if(count < 0){
			throw new Exception("参数'count'不能小于零");
		}
		
		if(count > objs.length){
			throw new Exception("参数'count'不能大于参数'objs'的长度");
		}
		
		if(objs.length == 0 || count == 0){
			return new Vector<List<Object>>();
		}
		
		List<List<Object>> result = new Vector<List<Object>>();
		
    	int MAX = objs.length;

    	int[] n = new int[count];
    	String maxStr = "";
    	String str = "";

    	for(int i=0; i<count; i++){
    		n[i] = i;
    	}

    	for(int i=MAX-count; i<MAX; i++){
    		maxStr += String.valueOf(i) + "_";
    	}
    	  
	    do{
	    	str = "";

    	    for(int i=count-1; i>=0; i--){
    	      if(n[i] > MAX - count + i){
    	        n[i-1]++;
    	        for(int j=i; j<count; j++){
    	          n[j] = n[j-1]+1;
    	        }
    	      }
    	    }

    	    for(int i=0; i<count; i++){
    	    	str += String.valueOf(n[i]) + "_";
    	    }
    	    
    	    List<Object> subList = new Vector<Object>();
    	    for(int idx : n){
    	    	subList.add(objs[idx]);
    	    }
    	    result.add(subList);

    	    n[count-1]++;
	    }while(!str.equals(maxStr));
	    
	    return result;
    }
}


运行结果:
0 1 2 3 4 5
=====================
测试 C(6,4)
0123
0124
0125
0134
0135
0145
0234
0235
0245
0345
1234
1235
1245
1345
2345
   发表时间:2007-09-18  
晕,没仔细阅读版规,被扣分了
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics