列出字符串所有组合

import java.math.BigInteger;
import java.util.*;
import java.io.*;
public class Demo {

    private int[] a;
    private BigInteger numLeft;
    private BigInteger total;
    public Demo(int n) {
        if (n < 1) {
            throw new IllegalArgumentException("Min 1");
        }
        a = new int[n];
        total = getFactorial(n);
        reset();
    }



    public void reset() {
        for (int i = 0; i < a.length; i++) {
            a[i] = i;
        }
        numLeft = new BigInteger(total.toString());
    }



    public BigInteger getNumLeft() {
        return numLeft;
    }



    public BigInteger getTotal() {
        return total;
    }


    public boolean hasMore() {
        return numLeft.compareTo(BigInteger.ZERO) == 1;
    }


    private static BigInteger getFactorial(int n) {
        BigInteger fact = BigInteger.ONE;
        for (int i = n; i > 1; i--) {
            fact = fact.multiply(new BigInteger(Integer.toString(i)));
        }
        return fact;
    }



    public int[] getNext() {

        if (numLeft.equals(total)) {
            numLeft = numLeft.subtract(BigInteger.ONE);
            return a;
        }

        int temp;

        // Find largest index j with a[j] < a[j+1]

        int j = a.length - 2;
        while (a[j] > a[j + 1]) {
            j--;
        }

        // Find index k such that a[k] is smallest integer
        // greater than a[j] to the right of a[j]

        int k = a.length - 1;
        while (a[j] > a[k]) {
            k--;
        }

        // Interchange a[j] and a[k]

        temp = a[k];
        a[k] = a[j];
        a[j] = temp;

        // Put tail end of permutation after jth position in increasing order

        int r = a.length - 1;
        int s = j + 1;

        while (r > s) {
            temp = a[s];
            a[s] = a[r];
            a[r] = temp;
            r--;
            s++;
        }

        numLeft = numLeft.subtract(BigInteger.ONE);
        return a;

    }
//程序测试入口
    public static void main(String[] args) {

        int[] indices;
        String[] elements = {"喔", "呼", "喂", "完", "哇", "哈"};
        Demo x = new Demo(elements.length);
        StringBuffer permutation;

		File file = new File("1.txt");
		PrintStream ps = null;
		try
		{
			ps = new PrintStream(file);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}		
		System.setOut(ps);
        while (x.hasMore()) 
        {
            permutation = new StringBuffer("%");
            indices = x.getNext();
            for (int i = 0; i < indices.length; i++) {
                permutation.append(elements[indices[i]]).append("%");
            }
			//输出到1.txt文件中
            System.out.println(permutation.toString());

        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值