Java打印无序全排列组合

指定 totalCount 和 numCount 后, 可以打印所有的排列组合

	// 全排列下标
    int allIndex = 0;
    // 目标数组长度
    private final int totalCount = 15;
    // 选几个数
    int numCount = 1;
    // 存储所有的排列
    private int[][] allSequence;
    // 存储单个排列
    private final int[] simple = new int[numCount];

    @Test
    public void test0831() {
        // 初始化allSequence
        double allSequenceCount = 1;
        for (int i=0; i<numCount; i++) {
            allSequenceCount = allSequenceCount * (totalCount-i) / (numCount-i);
        }
        allSequence = new int[(int)Math.round(allSequenceCount)][numCount];

        allPossible(0, numCount);
    }

    /**
     *
     * @param index 上一层选取的数的下标
     * @param count 这一层需要选几个数
     */
    public void allPossible(int index, int count) {
        for (int i=index; i<totalCount-count+1; i++) {
            simple[numCount - count] = i;
            if (count > 1) {
                allPossible(i+1, count - 1);
            } else {
                for (int j=0; j<numCount; j++) {
                    allSequence[allIndex][j] = simple[j];
                }
                allIndex++;
            }
        }
    }
/* * 基于列表实现(无序)词典结构 */ package dsa; public class Dictionary_DLNode implements Dictionary { private List L;//存放条目的列表 private EqualityTester T;//判等器 //构造方法 public Dictionary_DLNode() { this(new EqualityTesterDefault()); } //默认构造方法 public Dictionary_DLNode(EqualityTester t) { L = new List_DLNode(); T = t; } /***************************** ADT方法 *****************************/ //查询词典结构当前的规模 public int getSize() { return L.getSize(); } //判断词典结构是否为空 public boolean isEmpty() { return L.isEmpty(); } //若词典中存在以key为关键码的条目,则返回其中的一个条目;否则,返回null public Entry find(Object key) { Iterator P = L.positions(); while (P.hasNext()) { Position pos = (Position)P.getNext(); Entry entry = (EntryDefault) pos.getElem(); if (T.isEqualTo(entry.getKey(), key)) return entry; } return null; } //返回由关键码为key的条目组成的迭代器 public Iterator findAll(Object key) { List list = new List_DLNode(); Iterator P = L.positions(); while (P.hasNext()) { Position pos = (Position)P.getNext(); Entry entry = (EntryDefault) pos.getElem(); if (T.isEqualTo(entry.getKey(), key)) list.insertLast(entry); } return new IteratorElement(list); } //插入条目(key, value),并返回该条目 public Entry insert(Object key, Object value) { Entry entry = new EntryDefault(key, value);//创建新条目 L.insertFirst(entry);//将新条目插至表首,并 return entry;//返回null标志 } //若词典中存在以key为关键码的条目,则将摘除其中的一个并返回;否则,返回null public Entry remove(Object key) { Iterator P = L.positions(); while (P.hasNext()) {//逐一对比 Position pos = (Position)P.getNext();//各个位置 Entry entry = (EntryDefault) pos.getElem();//处的条目 if (T.isEqualTo(entry.getKey(), key)) {//若发现key已出现在某个条目中,则 Entry oldEntry = entry;//先保留该条目 L.remove(pos);//删除该条目 return oldEntry;//最后返回原先的条目 } }//若此循环结束,说明key尚未在词典中出现,因此 return null;//返回null标志 } //返回词典中所有条目的一个迭代器 public Iterator entries() { return new IteratorElement(L); }//直接利用List接口的方法生成元素迭代器 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值